gpt4 book ai didi

apache-spark - Pyspark DataFrame : Split column with multiple values into rows

转载 作者:行者123 更新时间:2023-12-03 16:13:09 24 4
gpt4 key购买 nike

我有一个数据框(具有更多的行和列),如下所示。

样本DF:

from pyspark import Row
from pyspark.sql import SQLContext
from pyspark.sql.functions import explode

sqlc = SQLContext(sc)

df = sqlc.createDataFrame([Row(col1 = 'z1', col2 = '[a1, b2, c3]', col3 = 'foo')])
# +------+-------------+------+
# | col1| col2| col3|
# +------+-------------+------+
# | z1| [a1, b2, c3]| foo|
# +------+-------------+------+

df
# DataFrame[col1: string, col2: string, col3: string]

我想要的是:

+-----+-----+-----+
| col1| col2| col3|
+-----+-----+-----+
| z1| a1| foo|
| z1| b2| foo|
| z1| c3| foo|
+-----+-----+-----+

我试图复制此处提供的 RDD解决方案: Pyspark: Split multiple array columns into rows

(df
.rdd
.flatMap(lambda row: [(row.col1, col2, row.col3) for col2 in row.col2)])
.toDF(["col1", "col2", "col3"]))

但是,它没有给出所需的结果

编辑: explode选项不起作用,因为它当前存储为字符串,并且 explode函数需要一个数组

最佳答案

您可以使用 explode ,但首先必须将数组的字符串表示形式转换为数组。

一种方法是使用 regexp_replace 删除开头和结尾的方括号,然后在split上删除 ", "

from pyspark.sql.functions import col, explode, regexp_replace, split

df.withColumn(
"col2",
explode(split(regexp_replace(col("col2"), "(^\[)|(\]$)", ""), ", "))
).show()
#+----+----+----+
#|col1|col2|col3|
#+----+----+----+
#| z1| a1| foo|
#| z1| b2| foo|
#| z1| c3| foo|
#+----+----+----+

关于apache-spark - Pyspark DataFrame : Split column with multiple values into rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57066797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com