Apache spark 在spark中将数组数据分解为行
我有以下方式的数据集:Apache spark 在spark中将数组数据分解为行,apache-spark,pyspark,Apache Spark,Pyspark,我有以下方式的数据集: 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 我想分解Arr
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上的数据,这样输出将按以下方式显示:
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中实现它。
请注意,输入数据集非常大。函数应该完成这项工作
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|
+----+----+----+
您可以使用explode函数 下面是您案例的简单示例
import 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")
希望这有帮助 explode正是您想要的。文件: 另外,下面是一个使用它的不同问题的示例:
你看过
explode()
函数了吗?我不明白,如果它在一列上工作,其他列会发生什么情况。也许你应该试试it@mtoto行。我的天啊,你帮了我大忙!谢谢