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

PySpark如何比较两列DataFrame并获取双方差异数据?

解决PySpark DataFrame对称差集问题

首先修正你的数据读取代码,确保加载时识别表头(否则列名会默认是_c0、_c1,影响后续操作):

df1 = spark.read.csv("/path/to/data1.csv", header=True)
df2 = spark.read.csv("/path/to/data2.csv", header=True)

你需要的是两个DataFrame的对称差集(仅在其中一个DF中出现的行),subtract只能获取单方向的差集,下面提供两种可行方案:

方案一:Union + GroupBy 统计筛选

将两个DF合并后,按所有列分组统计出现次数,仅保留出现次数为1的行(即只在其中一个DF存在的行):

# 合并两个DataFrame
combined_df = df1.union(df2)
# 分组统计并筛选差异行
diff_df = combined_df.groupBy(combined_df.columns).count().filter("count = 1").drop("count")
# 输出结果
diff_df.show()

方案二:Left Anti Join 双向获取后合并

利用left_anti连接分别获取两个DF独有的行,再合并结果:

# 获取仅在df1中存在的行
df1_unique = df1.join(df2, on=["col_name", "order"], how="left_anti")
# 获取仅在df2中存在的行
df2_unique = df2.join(df1, on=["col_name", "order"], how="left_anti")
# 合并差异行
diff_df = df1_unique.union(df2_unique)
# 输出结果
diff_df.show()

方案对比

  • 方案一实现简单,但合并全量数据后分组统计,在数据量较大时性能可能不如方案二。
  • 方案二通过两次定向的left_anti连接,只处理差异数据,大数据量下更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:16:28