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

Spark Scala中使用.join筛选db1存在但db2不存在的条目

问题原因

你当前的代码存在三个核心问题,完全无法实现差集匹配逻辑:

  • 匹配条件写反:需求是排除两个字段同时相等的重复记录,你写的条件是item不相等且cus_id相等,会匹配出大量无意义的跨商品同客户组合,和需求完全相悖
  • 存在笔误:条件里的bd2拼写错误,正确应为db2
  • 连接类型选错:inner join只会返回两边都满足匹配条件的行,不可能返回db1中独有的、在db2里没有对应条目的记录
正确实现方式

最简洁高效的方案是使用Spark专门为差集场景设计的left_anti连接类型,该连接会自动返回左表(db1)中、无法在右表(db2)按指定键匹配到的所有记录,且不会冗余返回右表字段,性能最优:

db1.join(
  db2,
  Seq("item", "cus_id"), // 判定两表重复的匹配规则:item和cus_id同时相等,该写法会自动合并同名列,避免结果出现重复字段
  "left_anti"
)

如果需要兼容不支持left_anti的旧版本引擎,也可以用左连接+空值过滤的方式实现等价逻辑:

db1.join(
  db2,
  db1("item") === db2("item") && db1("cus_id") === db2("cus_id"),
  "left"
).filter(db2("item").isNull)
 .select(db1("item"), db1("cus_id"))
运行结果

上述代码执行后会返回你预期的结果集:

{item: "charger", cus_id: 4567}
{item: "headset", cus_id: 5678}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:09:20