这是针对一般情况的解决方案,该解决方案不需要使用collect或使用udfs 提前知道数组的长度。不幸的是,这仅适用于spark2.1及更高版本,因为它需要该posexplode功能。
假设您具有以下DataFrame:
df = spark.createDataFrame(
[
[1, 'A, B, C, D'],
[2, 'E, F, G'],
[3, 'H, I'],
[4, 'J']
]
, ["num", "letters"]
)
df.show()
#+---+----------+
#|num| letters|
#+---+----------+
#| 1|A, B, C, D|
#| 2| E, F, G|
#| 3| H, I|
#| 4| J|
#+---+----------+
拆分letters列,然后使用posexplode爆炸结果数组以及数组中的位置。下一个用途pyspark.sql.functions.expr是pos在此数组的索引处获取元素。
import pyspark.sql.functions as f
df.select(
"num",
f.split("letters", ", ").alias("letters"),
f.posexplode(f.split(