如何对比两个PySpark DataFrame并提取双方的缺失值
实现方案
核心思路
以column1为关联键,将两个DataFrame做内连接,逐列对比后仅保留一方有值、另一方缺失值的场景,其余情况(双方值一致、双方都缺失)则置为空值,最终得到目标DataFrame C。
代码实现
from pyspark.sql import SparkSession from pyspark.sql.functions import when, col # 初始化SparkSession spark = SparkSession.builder.appName("df_missing_compare").getOrCreate() # 构建示例DataFrame A(模拟用户提供的数据) data_a = [ ("a", 25, "ast"), ("b", None, "phone"), ("c", 32, "dlp"), ("d", 45, None), ("e", 60, "phq") ] df_a = spark.createDataFrame(data_a, ["column1", "column2", "column3"]) # 构建示例DataFrame B(模拟用户提供的数据) data_b = [ ("a", 25, "ast"), ("b", 15, "phone"), ("c", 32, "dlp"), ("d", 45, "rare"), ("e", 60, "phq") ] df_b = spark.createDataFrame(data_b, ["column1", "column2", "column3"]) # 重命名B的列,避免连接后列名冲突 df_b_renamed = df_b.withColumnRenamed("column2", "column2_b").withColumnRenamed("column3", "column3_b") # 按column1内连接两个DataFrame joined_df = df_a.join(df_b_renamed, on="column1", how="inner") # 生成目标DataFrame C df_c = joined_df.select( col("column1"), # 处理column2:仅保留一方缺失、另一方有值的情况 when(col("column2").isNull() & col("column2_b").isNotNull(), col("column2_b")) .when(col("column2_b").isNull() & col("column2").isNotNull(), col("column2")) .alias("column2"), # 处理column3:逻辑与column2一致 when(col("column3").isNull() & col("column3_b").isNotNull(), col("column3_b")) .when(col("column3_b").isNull() & col("column3").isNotNull(), col("column3")) .alias("column3") ) # 展示结果 df_c.show()
代码说明
- 列名重命名:连接前给DataFrame B的列加后缀,避免连接后同名列冲突;
- 内连接:确保只处理两个DataFrame共有的
column1记录,匹配示例输出的行范围; - 条件判断:对每个列使用
when函数筛选:- 若A的列缺失、B的列有值,取B的列值;
- 若B的列缺失、A的列有值,取A的列值;
- 其他场景(双方值一致、双方都缺失)返回空值,对应示例中的空白展示。
内容的提问来源于stack exchange,提问作者karthik
相关产品推荐
相关产品推荐

