2017-06-09 162 views
0

具体结构我有一个dataframe DF可以保存为json文件中的结构如下:{"id":"1234567890","score":123.0,"date":yyyymmdd}保存数据帧的JSON在星火斯卡拉

一审我保存它,如下所示:

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

这DF需要在以下结构id::1234567890\t{"id":"1234567890","score":123.0,"date":yyyymmdd}

我尝试过各种方法来保存为json文件,但不能这样做。我们怎样才能以所需的格式保存它?

Spark version: 1.6.0 
Scala version: 2.10.6 
+0

这个JSON甚至有效吗?这是什么'id :: 1234567890 \ t' – philantrovert

+0

当你已经有一个数据帧时,为什么你需要保存这样的复杂情况,从中你可以随时提取'id'和'row'作为你的预期结果? –

回答

0

这不是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) 
+0

Iam出现以下错误。可能是由于我使用火花的版本ie Spark 1.6.0:线程“main”中的异常org.apache.spark.sql.AnalysisException:无法为内部类生成编码器com.company.class.RowMapper $ LineOfSomething“而不访问此类定义的范围。请尝试将此类从其父类中移出。 sql.catalyst.encoders.ExpressionEncoder $$ anonfun $ 2.applyOrElse(ExpressionEncoder.scala:264) \t at – qubiter

+0

你在主“对象”内部运行它吗?如果不是,则将案例类移入其自己的文件中。 – Nils

+0

RowMapper与其他映射器和案例类是单独的单例。我将这个新的案例类包含到RowMapper中。我仍然得到相同的错误。还看起来问题是数据集在底下?我不认为1.6.0支持数据集? – qubiter