PySpark如何获取一个DataFrame中不存在于另一个DataFrame的行
问题分析与正确实现
你尝试的三种方法失效原因如下:
- 不等值左连接写法:逻辑完全错误,不等值关联会产生笛卡尔积,完全不符合「提取df1独有的行」的需求
subtract方法:如果你使用的是Pandas,Pandas的subtract是数值减法运算API,不是行级差集方法;如果你使用的是PySpark,需要保证两个DataFrame的schema(列顺序、数据类型)完全一致才能正常返回差集- 布尔索引过滤写法:如果是PySpark,不支持直接用
[]加布尔序列做行过滤;如果是Pandas,旧版本需要将df2['customerId']转为列表才能正常匹配
正确实现方案
1. PySpark 场景(优先推荐)
使用专门的left_anti关联,性能最优,大数据量下效率远高于逐行判断:
# 按customerId匹配,取df1中未匹配到df2的行 diff = df1.join(df2, on="customerId", how="left_anti")
如果需要整行所有列完全匹配才排除,使用subtract(需保证两个DataFrame schema完全一致):
diff = df1.subtract(df2)
2. Pandas 场景
方法一:调整isin写法即可生效
diff = df1[~df1['customerId'].isin(df2['customerId'].tolist())]
方法二:用merge实现anti join,适合多列匹配的场景:
diff = df1.merge(df2[["customerId"]], on="customerId", how="left", indicator=True) diff = diff[diff["_merge"] == "left_only"].drop(columns="_merge")
内容的提问来源于stack exchange,提问作者TurboAza
相关产品推荐
相关产品推荐

