PySpark如何将多列同时拆分转为多行 解决拆分空值问题
PySpark实现多列拆分后全组合转多行方案
问题原因排查
你之前使用arrays_zip出现空值是因为该函数是按索引位置配对两个数组的元素,当两个数组长度不一致时,短数组缺失的索引位置会自动填充null。而你的需求是获取拆分后两个数组的全笛卡尔积组合,不需要按位置对齐,因此不需要使用zip相关函数。
具体实现代码
1. 导入依赖函数
from pyspark.sql.functions import split, explode
2. 核心处理逻辑
# 第一步:将subject和parts列按逗号拆分为数组 df_split = df \ .withColumn("subject_arr", split("subject", ",")) \ .withColumn("parts_arr", split("parts", ",")) # 第二步:分别对两个数组执行explode展开为多行,自动生成所有组合 df_result = df_split \ .withColumn("subject", explode("subject_arr")) \ .withColumn("parts", explode("parts_arr")) \ # 仅保留需要的输出列 .select("Name", "age", "subject", "parts")
3. 结果验证
执行df_result.show()即可得到你期望的输出:
+----+---+-------+-----+ |Name|age|subject|parts| +----+---+-------+-----+ |xxxx| 21| Maths| I| |xxxx| 21|Physics| I| |yyyy| 22|English| I| |yyyy| 22|English| II| |yyyy| 22| French| I| |yyyy| 22| French| II| +----+---+-------+-----+
可选优化
如果你的数据中存在拆分后是空数组的场景,不想让整行数据被丢弃,可以将explode替换为explode_outer,空数组对应的位置会自动填充null。
内容的提问来源于stack exchange,提问作者Padfoot123
相关产品推荐
相关产品推荐

