当使用 PySpark 在列中 comma-separated 时,如何将列拆分为它们自己的行?

How can I split columns to their own row when comma-separated in column using PySpark?

如标题所示,我需要拆分出一些 comma-separated 的列。我还想对每行的列执行笛卡尔积。

假设源数据如下所示:

Id Name Codes_A Codes_B
1 George 1,2 3,4
2 Mary 5,6 7,8

我希望结果如下所示,其中 comma-separated 列中的所有值都组合成每个可能的结果。

Id Name Codes_A Codes_B
1 George 1 3
1 George 1 4
1 George 2 3
1 George 2 4
2 Mary 5 7
2 Mary 5 8
2 Mary 6 7
2 Mary 6 8

这是 Codes_A 和 Codes_B 值的笛卡尔积。
我假设这是您实际需要的。

演示设置

df = spark.createDataFrame([(1,'George','1,2','3,4'),(2,'Mary','5,6','7,8')],['Id','Name','Codes_A','Codes_B'])

df.show()

+---+------+-------+-------+
| Id|  Name|Codes_A|Codes_B|
+---+------+-------+-------+
|  1|George|    1,2|    3,4|
|  2|  Mary|    5,6|    7,8|
+---+------+-------+-------+

解决方案

import pyspark.sql.functions as F

df_result = (df
             .withColumn('Codes_A', F.explode(F.split('Codes_A',',')))
             .withColumn('Codes_B', F.explode(F.split('Codes_B',',')))
            )

df_result.show()

+---+------+-------+-------+
| Id|  Name|Codes_A|Codes_B|
+---+------+-------+-------+
|  1|George|      1|      3|
|  1|George|      1|      4|
|  1|George|      2|      3|
|  1|George|      2|      4|
|  2|  Mary|      5|      7|
|  2|  Mary|      5|      8|
|  2|  Mary|      6|      7|
|  2|  Mary|      6|      8|
+---+------+-------+-------+