2017-06-08 134 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") 

希望這有助於!