如何将一行数组平面映射为多行?
How do I flatMap a row of arrays into multiple rows?
在解析了一些 json 之后,我有一个单列的数组 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)]
我想将每一行分解成几行。怎么样?
编辑:
原始 json 文件:
{"r": [0,1,2,3,4,5,6,7,8,9]}
{"r": [0,1,2,3,4,5,6,7,8,9]}
我想要一个 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)
您可以使用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
您可以参考API文档了解更多DataFrame.explode
我已经用 Spark 1.3.1 测试过了
或者你可以使用 Row.getAs 函数:
import scala.collection.mutable.ArrayBuffer
val elementsRdd = jj.select(jj("r")).map(t=>t.getAs[ArrayBuffer[Long]](0)).flatMap(x=>x)
elementsRdd.count()
>>>Long = 20
elementsRdd.take(5)
>>>Array[Long] = Array(0, 1, 2, 3, 4)
在 Spark 1.3+ 中,您可以直接在感兴趣的列上使用 explode
函数:
import org.apache.spark.sql.functions.explode
jj.select(explode($"r"))
在解析了一些 json 之后,我有一个单列的数组 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)]
我想将每一行分解成几行。怎么样?
编辑:
原始 json 文件:
{"r": [0,1,2,3,4,5,6,7,8,9]}
{"r": [0,1,2,3,4,5,6,7,8,9]}
我想要一个 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)
您可以使用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
您可以参考API文档了解更多DataFrame.explode
我已经用 Spark 1.3.1 测试过了 或者你可以使用 Row.getAs 函数:
import scala.collection.mutable.ArrayBuffer
val elementsRdd = jj.select(jj("r")).map(t=>t.getAs[ArrayBuffer[Long]](0)).flatMap(x=>x)
elementsRdd.count()
>>>Long = 20
elementsRdd.take(5)
>>>Array[Long] = Array(0, 1, 2, 3, 4)
在 Spark 1.3+ 中,您可以直接在感兴趣的列上使用 explode
函数:
import org.apache.spark.sql.functions.explode
jj.select(explode($"r"))