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 有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章