如何将Spark Dataframe行映射到案例类数组?

时间:2016-12-22 14:48:44

标签: json scala apache-spark spark-dataframe

假设我有一个这样的数据框:

var df = sqlContext.createDataFrame(Seq((1,"James"),(2,"Anna"))).toDF("id", "name")

我的目标是将其编写为有效的JSON输出。但是,如果我将其写入JSON,我会在每一行上获得一个包含单个JSON对象的文件,并且它不是有效的JSON。

因此我想要一个这样的结构:

root
|-- Result: array (nullable = true)
|    |-- element: struct (containsNull = true)
|    |    |-- id: string (nullable = true)
|    |    |-- name: string (nullable = false)

如果我为一行创建一个案例类:

case class ResultRow(id: String, name: String)

我可以用它将初始数据帧映射到它的对象。

或者如果使用df.collect(),我会获得一系列行。然后我可以创建这个类的对象:

case class Result(var Result: Array[ResultRow])

然后我可以遍历收集的Row对象,将它们映射到ResultRow对象并添加到Result类实例中的数组。然后我可以将对象转换为新的数据帧并将其写入JSON。

但是这种方法的问题是collect()将所有数据收集到驱动程序中,当我有数十万行时,运行时需要数小时。

我想获得一个数据框,其中包含一列Array类型,另一行包含此数组,其中包含初始数据帧的所有行作为单个元素,并且不使用collect()执行此操作。

感谢任何帮助

0 个答案:

没有答案