【发布时间】:2019-11-25 18:04:33
【问题描述】:
我有一个数据框(包含更多行和列),如下所示。
样本 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,这可以通过split和regexp_replace来完成。 -
字符串转数组示例here
-
@pault -
explode将不起作用,因为我的所有列都存储为字符串
标签: apache-spark pyspark apache-spark-sql pyspark-sql