You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比两个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()

代码说明

  1. 列名重命名:连接前给DataFrame B的列加后缀,避免连接后同名列冲突;
  2. 内连接:确保只处理两个DataFrame共有的column1记录,匹配示例输出的行范围;
  3. 条件判断:对每个列使用when函数筛选:
    • 若A的列缺失、B的列有值,取B的列值;
    • 若B的列缺失、A的列有值,取A的列值;
    • 其他场景(双方值一致、双方都缺失)返回空值,对应示例中的空白展示。

内容的提问来源于stack exchange,提问作者karthik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:01:03