使用PySpark从原始DataFrame中删除匹配另一DataFrame多列条件的子集行
问题原因说明
你当前的实现存在两个问题:
- 连接类型用了默认的内连接,只会返回两个表中
id和school同时匹配的记录,不可能得到剔除匹配项后的DF1结果 - 代码存在语法错误,join条件的括号没有正确闭合,
select方法的调用位置错误
正确实现方案
方案1:使用left anti join(最推荐)
左反连接是PySpark专门为该类场景设计的连接类型,只会返回左表中没有和右表匹配到的记录,性能最优,代码实现也最简单:
# 以id和school为匹配键,做左反连接 result_df = DF1.join(DF2, on=["id", "school"], how="left_anti")
执行后得到的result_df就是你需要的、剔除了所有和DF2匹配记录后的DF1数据。
方案2:左连接后过滤空值
如果需要更灵活的匹配后处理逻辑,也可以用左连接+过滤的方式实现:
# 左连接后,筛选右表id为空的记录(即DF1中没有匹配到DF2的记录) joined_df = DF1.join(DF2, on=["id", "school"], how="left") result_df = joined_df.filter(DF2.id.isNull()).select(DF1["*"])
两种方案最终得到的结果完全一致,推荐优先用左反连接的方案,避免多余的数据处理步骤,性能更好。
内容的提问来源于stack exchange,提问作者tharindu
相关产品推荐
相关产品推荐

