Spark SQL 中的 OUTER 和 FULL OUTER 有区别吗?

Posted

技术标签:

【中文标题】Spark SQL 中的 OUTER 和 FULL OUTER 有区别吗?【英文标题】:Is there a difference between OUTER & FULL_OUTER in Spark SQL? 【发布时间】:2017-10-02 09:37:38 【问题描述】:

Spark SQL 文档指定 join() 支持以下连接类型:

必须是以下之一:inner、cross、outer、full、full_outer、left、 left_outer、right、right_outer、left_semi 和 left_anti。

Spark SQL Join()

outerfull_outer 有什么区别吗?我怀疑不是,我怀疑它们只是彼此的同义词,但想弄清楚。

【问题讨论】:

【参考方案1】:

outerfull_outer 之间没有区别 - 它们是相同的。请参阅以下答案进行演示:What are the various join types in Spark?

【讨论】:

【参考方案2】:

Spark v2.4.0 加入代码(_ 已被抑制):

case "inner" => Inner
case "outer" | "full" | "fullouter" => FullOuter
case "leftouter" | "left" => LeftOuter
case "rightouter" | "right" => RightOuter
case "leftsemi" => LeftSemi
case "leftanti" => LeftAnti
case "cross" => Cross

所以 Spark 确实支持:Inner、FullOuter、LeftOuter、RightOuter、LeftSemi、LeftAnti 和 Cross。

简单的例子,给出:

+---+-----+
| id|value|
+---+-----+
|  1|   A1|
|  2|   A2|
|  3|   A3|
|  4|   A4|
+---+-----+

和:

+---+-----+
| id|value|
+---+-----+
|  3|   A3|
|  4|   A4|
|  4| A4_1|
|  5|   A5|
|  6|   A6|
+---+-----+

你得到:

外连接

+----+-----+----+-----+
|  id|value|  id|value|
+----+-----+----+-----+
|null| null|   5|   A5|
|null| null|   6|   A6|
|   1|   A1|null| null|
|   2|   A2|null| null|
|   3|   A3|   3|   A3|
|   4|   A4|   4|   A4|
|   4|   A4|   4| A4_1|
+----+-----+----+-----+

FULL_OUTER JOIN

+----+-----+----+-----+
|  id|value|  id|value|
+----+-----+----+-----+
|null| null|   5|   A5|
|null| null|   6|   A6|
|   1|   A1|null| null|
|   2|   A2|null| null|
|   3|   A3|   3|   A3|
|   4|   A4|   4|   A4|
|   4|   A4|   4| A4_1|
+----+-----+----+-----+

【讨论】:

以上是关于Spark SQL 中的 OUTER 和 FULL OUTER 有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

sql MS SQL Full Outer Join

[19]SQL FULL OUTER JOIN 关键字

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)

当列不共享任何参数(包括主键)时,如何在 MS SQL Server 中进行 FULL OUTER JOIN?

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)