2017-06-08 15 views
3

の行に配列データを爆発:私は、次の方法でデータセット持って火花

:ので、出力は次のようになります私は ArrayField上のデータを爆発したい

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

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

私は配列内の各項目の出力行をArrayFieldに生成し、他のフィールドの値は保持したいとします。

どのようにSparkで実装しますか? 入力データセットが非常に大きいことに注意してください。

+0

あなたは '爆発()'関数を見てきましたか? – mtoto

+0

私はそれが1つの列で動作する場合、他の列に何が起こるかはわかりません。 – 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のバージョンあなたは以下の機能 を爆発使用することができます

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") 

希望します。

関連する問題