“右外部连接”和“左外部连接”在配置单元中的执行方式不同吗?
例如,表A是一个小表。表B要大得多,并且在col2上分区。
问题1: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还是我遗漏了什么?
谢谢!
发布于 2014-07-16 16:50:56
我经历了同样的事情(不知道为什么会这样,是bug还是特性。我肯定会认为这是一个bug)。由于我经常使用left outer join,所以我使用以下解决方法:
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)
我正在开发蜂巢0.11...如果在以后的版本中修复了这个问题,那将会很有趣。
发布于 2014-07-25 09:42:46
查询1表B是保留表,因此B的where谓词是下推的。
查询2表B不是保留表,因此B的where predicate will pushdown.hive将扫描整个表B
有关更多详细信息,请参阅此OuterJoinBehavior
https://stackoverflow.com/questions/19577425
复制相似问题