我有一个数据框,有一行和几列.一些列是单个值,其他列是列表.所有列表列的长度都相同.我想将每个列表列拆分为一个单独的行,同时保持任何非列表列不变.
样本DF:
from pyspark import Row
from pyspark.sql import SQLContext
from pyspark.sql.functions import explode
sqlc = SQLContext(sc)
df = sqlc.createDataFrame([Row(a=1, b=[1,2,3],c=[7,8,9], d='foo')])
# +---+---------+---------+---+
# | a| b| c| d|
# +---+---------+---------+---+
# | 1|[1, 2, 3]|[7, 8, 9]|foo|
# +---+---------+---------+---+
Run Code Online (Sandbox Code Playgroud)
我想要的是:
+---+---+----+------+
| a| b| c | d |
+---+---+----+------+
| 1| 1| 7 | foo |
| 1| 2| 8 | foo |
| 1| 3| 9 | foo |
+---+---+----+------+
Run Code Online (Sandbox Code Playgroud)
如果我只有一个列表列,只需执行以下操作即可explode:
df_exploded = df.withColumn('b', explode('b')) …Run Code Online (Sandbox Code Playgroud) 我有以下方式的数据集:
FieldA FieldB ArrayField
1 A {1,2,3}
2 B {3,5}
Run Code Online (Sandbox Code Playgroud)
我想爆炸ArrayField上的数据,因此输出将以下列方式显示:
FieldA FieldB ExplodedField
1 A 1
1 A 2
1 A 3
2 B 3
2 B 5
Run Code Online (Sandbox Code Playgroud)
我的意思是我想为ArrayField中的每个项生成一个输出行,同时保持其他字段的值.
你将如何在Spark中实现它.请注意,输入数据集非常大.