INNER JOIN 和 ANTI JOIN 有啥区别

Posted

技术标签:

【中文标题】INNER JOIN 和 ANTI JOIN 有啥区别【英文标题】:What is the difference between INNER JOIN and ANTI JOININNER JOIN 和 ANTI JOIN 有什么区别 【发布时间】:2018-12-14 11:21:35 【问题描述】:

我对 PySpark 中的连接术语感到非常困惑。我将列出我如何理解其中两个连接,我只是想知道我的理解是否正确,因为我发现文档更令人困惑而不是有用。

我们从两个数据帧开始:dfAdfB

dfA.join(dfB, 'user', 'inner') 

表示只连接dfAdfB 在用户列上有共同元素的行。 (用户列上 A 和 B 的交集)。

dfA.join(dfB, 'user', 'leftanti') 

表示用dfA中的元素构造一个数据框THAT ARE NOTdfB中。

这两个是正确的吗?

【问题讨论】:

你的理解是正确的。更好的是,在样本数据上运行它并检查输出。 是的,做到了。我只是从我的数据库中得到有趣的结果,所以我想确保至少我知道我在说什么。谢谢。如果有人愿意,您可以写一个关于联接的更详细的答案(可能有一些例子),我会接受答案。 你能展示一下有趣的结果是什么吗? 例如我有一个数据集,我们称它为actions_night,另一个叫actions_day。如果我对actions_night 和actions_day 进行leftanti 连接,我得到0。不可能只在夜间没有看到一个用户。 为什么说不可能? 【参考方案1】:

inner join => 如果 DFB 没有 DFA 的记录,那么它不会返回不匹配的记录。

left anti => 最接近 Not Exists

-- NOT EXISTS
SELECT *
FROM dfA
WHERE NOT EXISTS (
  SELECT 1
  FROM dfB
  WHERE dfA.DeptName = dfB.DeptName
)

也相当于 LEFT OUTER JOIN

SELECT * 
FROM dfA
LEFT OUTER JOIN DFB
  ON dfA.DeptName = dfB.DeptName
where dfB.DeptName IS NULL;

【讨论】:

以上是关于INNER JOIN 和 ANTI JOIN 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有啥区别? [复制]

INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有啥区别? [复制]

INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有啥区别? [复制]

“INNER JOIN”和“OUTER JOIN”有啥区别?

“INNER JOIN”和“OUTER JOIN”有啥区别?

CROSS JOIN 和 INNER JOIN 有啥区别[关闭]