当使用 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|
+---+------+-------+-------+
如标题所示,我需要拆分出一些 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|
+---+------+-------+-------+