繁体   English   中英

如何在 Scala 中使用 json4s 将 Spark Dataframe 转换为 JSON?

[英]How to convert Spark Dataframe to JSON using json4s, in Scala?

尝试将 dataframe 转换为 JSON 字符串,而 output 只是 {}。 不确定我做错了什么?

这只是一个测试,但我需要使用的完整 Dataframe 模式是 800 多列,所以如果可能的话,我不想在代码中专门指定每个字段,代码在锁定的公司环境中运行,所以我不能写或读取文件到系统。 只能是字符串 output。

import org.json4s.jackson.Serialization.write
import org.json4s.DefaultFormats

implicit val formats = DefaultFormats

val test = spark.sql("SELECT field1, field2, field3 FROM myTable LIMIT 2");

println("Output:");
write(test);


Output:
res12: String = {}

雪上加霜的是,我可以使用内置的 toJSON function(来自 scala.util.parsing.json._),但我们的企业环境已将 spark.sql.jsonGenerator.ignoreNullFields 设置为 True,它无法更改,但output 必须包括 null 字段 - 希望 json4s 可以帮助:)

谢谢

不确定我做错了什么?

那是因为spark.sql(...)返回一个 DataFrame,而DataFrame的所有实例变量都是私有的,因此您的解析器基本上会忽略它们。 你可以试试这个:

case class PrivateStuff(private val thing: String)

write(PrivateStuff("something"))
// ourputs {}

所以你不能只将整个 DataFrame 转换为 JSON,你可以做的是收集数据(返回Array[Row]List[Row] )并尝试将每一行转换为 Scala 对象,因为结果将行转换为 JSON 可能不是您想要的,然后使用写入 function:

case class YourModel(x1: String, ...)
object YourModel {
  def fromRow(row: Row): Option[YourModel] = // conversion logic here
}

val myData: Array[YourModel] = spark.sql("SELECT ...")
  .collect()
  .map(YourModel.fromRow)
  .collect { case Some(value) => value }

write(myData)

更新


在解释了行的大小之后,创建案例类没有意义,您可以使用Row class 的json方法来实现这一点(它不关心spark.sql.jsonGenerator.ignoreNullFields ):

val test = spark.sql("SELECT field1, field2, field3 FROM myTable LIMIT 2")

val jsonDF = test.map(_.json)

这是一个 dataframe 的 JSON 对象,你可以收集它们,将它们保存到文件中,展示它们,基本上你可以用 dataframe 做任何事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM