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
相关产品推荐
相关产品推荐

