Pyspark DataFrame:将具有多个值的列拆分为行

Smi*_*itM 5 apache-spark apache-spark-sql pyspark pyspark-sql

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

示例 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]
Run Code Online (Sandbox Code Playgroud)

我想要的是:

+-----+-----+-----+
| col1| col2| col3|
+-----+-----+-----+
|   z1|   a1|  foo|
|   z1|   b2|  foo|
|   z1|   c3|  foo|
+-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)

我试图复制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"]))
Run Code Online (Sandbox Code Playgroud)

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

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

pau*_*ult 4

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

一种方法是使用regexp_replace删除前导方括号和尾随方括号,然后使用spliton ", "

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|
#+----+----+----+
Run Code Online (Sandbox Code Playgroud)