假设我有一个这样的数据框:
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()
执行此操作。
感谢任何帮助