PySpark中如何用另一DataFrame覆盖原表含NULL值的行
实现方案
可以根据你使用的 DataFrame 运行环境选择对应方案:
Pandas 环境实现
核心逻辑是按主键Id左关联两个表后,用df1的对应字段填充df的空值:
# 按Id左连接两个表,给df1的重复列加后缀区分 merged_df = df.merge(df1, on="Id", how="left", suffixes=("", "_backup")) # 遍历需要补全的列,用df1的值填充空值 fill_cols = ["Latitude", "Longitude"] for col in fill_cols: merged_df[col] = merged_df[col].fillna(merged_df[f"{col}_backup"]) # 清理多余的备份列,得到最终结果 result_df = merged_df.drop(columns=[c for c in merged_df.columns if "_backup" in c])
PySpark 环境实现
Spark 内置的coalesce函数可以直接取第一个非空值,实现更简洁:
from pyspark.sql.functions import coalesce # 按Id左关联两个表,分别取别名区分 joined_df = df.alias("origin").join(df1.alias("backup"), on="Id", how="left") # 构造查询逻辑,空值字段用备份表的值覆盖 result_df = joined_df.select( "origin.Id", "origin.Name", "origin.Country", "origin.City", "origin.Address", coalesce("origin.Latitude", "backup.Latitude").alias("Latitude"), coalesce("origin.Longitude", "backup.Longitude").alias("Longitude") )
如果需要补全的字段更多,只需要对应修改fill_cols(Pandas)或者select里的字段列表(PySpark)即可,逻辑通用。
内容的提问来源于stack exchange,提问作者Rustam-Z
相关产品推荐
相关产品推荐

