如何将一行数组平面映射为多行?

dra*_*nxo 5 apache-spark apache-spark-sql

在解析了一些jsons后,我有一个数组的单列DataFrame

scala> val jj =sqlContext.jsonFile("/home/aahu/jj2.json")
res68: org.apache.spark.sql.DataFrame = [r: array<bigint>]
scala> jj.first()
res69: org.apache.spark.sql.Row = [List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)]
Run Code Online (Sandbox Code Playgroud)

我想把每一行分成几行.怎么样?

编辑:

原始的json文件:

{"r": [0,1,2,3,4,5,6,7,8,9]}
{"r": [0,1,2,3,4,5,6,7,8,9]}
Run Code Online (Sandbox Code Playgroud)

我想要一个20行的RDD或DataFrame.

我不能简单地在这里使用flatMap - 我不确定spark中的相应命令是什么:

scala> jj.flatMap(r => r)
<console>:22: error: type mismatch;
 found   : org.apache.spark.sql.Row
 required: TraversableOnce[?]
              jj.flatMap(r => r)
Run Code Online (Sandbox Code Playgroud)

小智 4

您可以使用它DataFrame.explode来实现您的愿望。下面是我在 Spark-Shell 中尝试使用示例 json 数据进行的操作。

import scala.collection.mutable.ArrayBuffer
val jj1 = jj.explode("r", "r1") {list : ArrayBuffer[Long] => list.toList }
val jj2 = jj1.select($"r1")
jj2.collect
Run Code Online (Sandbox Code Playgroud)

您可以参考API文档来了解更多DataFrame.explode