【问题标题】:Save dataframe as JSON in specific structure in Spark Scala在 Spark Scala 中以特定结构将数据帧另存为 JSON
【发布时间】:2017-11-10 23:20:57
【问题描述】:

我有一个dataframe df,它可以保存为json 文件,结构如下:{"id":"1234567890","score":123.0,"date":yyyymmdd}

首先,我将其保存如下:

df.write.format("json").save("path")

这个df需要保存为json文件,结构如下id::1234567890\t{"id":"1234567890","score":123.0,"date":yyyymmdd}

我尝试了各种方法,但都做不到。我们如何将其保存为所需的格式?

Spark version: 1.6.0
Scala version: 2.10.6

【问题讨论】:

  • 这个 JSON 是否有效?这是什么id::1234567890\t
  • 当您已经有一个数据框可以随时从中提取 idrow 作为您的预期结果时,为什么还要保存这些复杂的东西?

标签: json scala apache-spark dataframe


【解决方案1】:

那不是json格式。您最好使用 rdd,然后将其转换为自定义格式。

final case class LineOfSomething(id: String, score: BigDecimal, date: String)
import sqlContext.implicits._
df
  .as[LineOfSomething]
  .rdd
  .mapPartitions(lines => {
    val mapper = new com.fasterxml.jackson.databind.ObjectMapper()
    mapper.registerModule(com.fasterxml.jackson.module.scala.DefaultScalaModule)
    lines.map(line => {
      val json = mapper.writeValueAsString(line)
      s"id::${line.id}\t$json"
    })
  })
  .saveAsTextFile(output)

【讨论】:

  • 我收到以下错误。可能是由于我使用的 Spark 版本,即 Spark 1.6.0:线程“主”org.apache.spark.sql.AnalysisException 中的异常:无法为内部类com.company.class.RowMapper$LineOfSomething 生成编码器而无法访问此类已定义。尝试将此类移出其父类。 sql.catalyst.encoders.ExpressionEncoder$$anonfun$2.applyOrElse(ExpressionEncoder.scala:264) 在
  • 你是在主“对象”中运行它吗?如果没有,请将案例类移动到它自己的文件中。
  • RowMapper 是与其他映射器和案例类分开的单例。我将这个新案例类包含在 RowMapper 中。我仍然不断收到同样的错误。看起来问题出在引擎盖下的数据集上?我不认为 1.6.0 支持数据集?
  • 代替这个结构:id::1234567890\t{"id":"1234567890","score":123.0,"date":yyyymmdd} 在文本文件中。我们可以在这个结构中以 json 文件的形式获取它吗: {"id"::1234567890, {"id":"1234567890","score":123.0,"date":yyyymmdd} } 。我仍然收到无法生成编码器异常。
  • 您确定您已导入隐式并尝试将案例类移动到其自己的文件中吗?通常“无法生成编码器”是因为您将案例类作为 spark 无法访问的内部类。
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2018-09-12
相关资源
最近更新 更多