2017-06-08 101 views
3

我有以下方式的数据集:爆炸阵列数据成行火花

FieldA FieldB ArrayField 
1   A   {1,2,3} 
2   B   {3,5} 

我想发生爆炸ArrayField的数据,因此输出看起来下列方式:

FieldA FieldB ExplodedField 
1   A   1 
1   A   2 
1   A   3 
2   B   3 
2   B   5 

我的意思是我想为阵列中的每个项目生成一个输出行,在ArrayField,同时保持其他字段的值。

你将如何在Spark中实现它。 注意输入数据集非常大。

+0

你看了'爆炸()'函数? – mtoto

+0

我不明白,如果它在一列上工作,其他列将会发生什么情况。 – Gluz

+0

也许你应该试试 – mtoto

回答

5

explode函数应该完成。

pyspark版本:

>>> df = spark.createDataFrame([(1, "A", [1,2,3]), (2, "B", [3,5])],["col1", "col2", "col3"]) 
>>> from pyspark.sql.functions import explode 
>>> df.withColumn("col3", explode(df.col3)).show() 
+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
| 1| A| 1| 
| 1| A| 2| 
| 1| A| 3| 
| 2| B| 3| 
| 2| B| 5| 
+----+----+----+ 

斯卡拉版本

scala> val df = Seq((1, "A", Seq(1,2,3)), (2, "B", Seq(3,5))).toDF("col1", "col2", "col3") 
df: org.apache.spark.sql.DataFrame = [col1: int, col2: string ... 1 more field] 

scala> df.withColumn("col3", explode($"col3")).show() 
+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
| 1| A| 1| 
| 1| A| 2| 
| 1| A| 3| 
| 2| B| 3| 
| 2| B| 5| 
+----+----+----+ 
1

可以使用爆炸功能 下面是你的情况 进口org.apache.spark.sql简单的例子.functions._

import spark.implicits._ 

    val data = spark.sparkContext.parallelize(Seq(
    (1, "A", List(1,2,3)), 
    (2, "B", List(3, 5)) 
)).toDF("FieldA", "FieldB", "FieldC") 

    data.withColumn("ExplodedField", explode($"FieldC")).drop("FieldC") 

希望这有助于!