-1

“RIGHT OUTER JOIN”和“LEFT OUTER JOIN”在 HIVE 中的表现是否不同?

例如,表 A 是一个小表。表 B 要大得多,并且在 col2 上进行了分区。

查询一: SELECT * FROM A RIGHT OUTER JOIN B on (A.col=B.col) WHERE B.col2>20131001

查询 2: SELECT * FROM A LEFT OUTER JOIN B on (A.col=B.col) WHERE B.col2>20131001

查询 1 只扫描少量分区,但查询 2 扫描表 B 的所有分区。是 bug 还是我遗漏了什么?

谢谢!

4

2 回答 2

0

我经历过同样的事情(不知道为什么会这样,错误或功能。我肯定会认为这是一个错误)。由于我大量使用左外连接,因此我使用以下解决方法:

SELECT *
FROM A
LEFT OUTER JOIN
  (SELECT *
   FROM B
   WHERE B.COL2 >20131001) ON (A.COL=B.COL)

或者

SELECT *
FROM A
LEFT OUTER JOIN B ON (A.COL= B.COL
                      AND B.COL2 > 20131001)

我正在开发 Hive 0.11 ...如果在以后的版本中修复了这个问题会很有趣。

于 2014-07-16T08:50:56.177 回答
0

查询 1 表 B 是保留表,因此 B 的谓词是下推。

查询 2 表 B 不是保留表,因此 B 的 where 谓词不会下推。hive 将扫描整个表 B

有关更多详细信息,请参见此内容 OuterJoinBehavior

于 2014-07-25T01:42:46.043 回答