PySpark全连接自定义优化:解决Org字段空值问题
解决PySpark全连接后Org字段空值问题
问题原因
全连接(full join)会保留两个DataFrame的所有记录:
- 当记录仅存在于df1时,df2对应的字段(包括Org)会为null
- 当记录仅存在于df2时,df1对应的字段(包括Org)会为null
要让Org字段始终有值,需要合并两个表的Org字段,取非空的那个值。
解决方案
使用PySpark的coalesce函数,该函数会返回参数列表中第一个非空值。用它合并df1和df2的Org字段,即可替换掉原有的空值Org。
修改后的完整代码
# 定义数据 data1=[('16','123456','SuryaAndCo','FY2022Q2','12'), ('16','1234567','SuryaAndCo','FY2022Q2','11'), ('16','12345678','SuryaAndCo','FY2022Q2','19'), ('17','23456','BabJiAndCo','FY2021Q1','2'), ('17','2345689','BabJiAndCo','FY2021Q1','12'), ('18','23445','SalBhai','FY2023Q1','11'),] data2=[('16','123456','SuryaAndCo','FY2022Q2','22'), ('16','1234567','SuryaAndCo','FY2022Q2','222'), ('16','12345678','SuryaAndCo','FY2022Q2','33'), ('17','23456','BabJiAndCo','FY2021Q1','44'), ('17','2345644','BabJiAndCo','FY2021Q1','55'), ('19','23445','SalBhai','FY2023Q1','77'),] # 创建DataFrame df1=spark.createDataFrame(data1,['Org','Item Number','Supplier','FiscalPeriod','QtyL']) df2=spark.createDataFrame(data2,['Org','Item Number','Supplier','FiscalPeriod','QtyR']) # 执行全连接 fulldf = df1.join(df2, on=['Supplier','Item Number','FiscalPeriod'], how='full') # 合并Org字段,消除空值 from pyspark.sql.functions import coalesce fulldf = fulldf.withColumn('Org', coalesce(df1.Org, df2.Org)) # 展示结果 display(fulldf)
说明
coalesce(df1.Org, df2.Org)会优先取df1中的Org值;若df1.Org为null(即该记录仅来自df2),则自动取df2.Org的值- 从你的数据来看,相同连接键对应的Org值是一致的,因此合并后的结果不会出现冲突
内容的提问来源于stack exchange,提问作者AzSurya Teja
相关产品推荐
相关产品推荐

