如何在PySpark的数据框中拆分包含逗号分隔值的列?

5
我是一位有用的助手,可以为您翻译文本。
我有一个PySpark数据框,其中一列包含逗号分隔的值。该列包含的值数量是固定的(比如说4个)。 例如:
+----+----------------------+
|col1|                  col2|
+----+----------------------+
|   1|val1, val2, val3, val4|
|   2|val1, val2, val3, val4|
|   3|val1, val2, val3, val4|
|   4|val1, val2, val3, val4|
+----+----------------------+

在这里我想将col2拆分成4个单独的列,如下所示:

+----+-------+-------+-------+-------+
|col1|  col21|  col22|  col23|  col24|
+----+-------+-------+-------+-------+
|   1|   val1|   val2|   val3|   val4|
|   2|   val1|   val2|   val3|   val4|
|   3|   val1|   val2|   val3|   val4|
|   4|   val1|   val2|   val3|   val4|
+----+-------+-------+-------+-------+

这怎么做?

4
可能是将 Spark 数据框中的字符串列拆分为多个列的重复问题。 - Florian
1
我在相关的重复问题中发布了一个答案,展示了如何在不使用udfcollect的情况下完成一般情况下的操作。 - pault
1个回答

14
我会将该列拆分,并将数组的每个元素作为新列。
from pyspark.sql import functions as F

df = spark.createDataFrame(sc.parallelize([['1', 'val1, val2, val3, val4'], ['2', 'val1, val2, val3, val4'], ['3', 'val1, val2, val3, val4'], ['4', 'val1, val2, val3, val4']]), ["col1", "col2"])

df2 = df.select('col1', F.split('col2', ', ').alias('col2'))

# If you don't know the number of columns:
df_sizes = df2.select(F.size('col2').alias('col2'))
df_max = df_sizes.agg(F.max('col2'))
nb_columns = df_max.collect()[0][0]

df_result = df2.select('col1', *[df2['col2'][i] for i in range(nb_columns)])
df_result.show()
>>>
+----+-------+-------+-------+-------+
|col1|col2[0]|col2[1]|col2[2]|col2[3]|
+----+-------+-------+-------+-------+
|   1|   val1|   val2|   val3|   val4|
|   2|   val1|   val2|   val3|   val4|
|   3|   val1|   val2|   val3|   val4|
|   4|   val1|   val2|   val3|   val4|
+----+-------+-------+-------+-------+

是的!F.split() 是正确的方法! - exAres
有没有办法更改新生成的列名,例如level1、level2等,而不是col1、col2? - deathrace
我暂时使用这个:df_res = df_result.toDF(*(c.replace('col2', 'level') for c in df_result.columns)) - deathrace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接