2013-10-24 35 views
0

在HIVE中,「右外連接」和「左外連接」的表現有何不同?右側/左側外部JOIN在HIVE中的表現有所不同?

例如,表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或我錯過了什麼?

謝謝!

+0

你的意思是分區是由'col2' (時間)和'B.col2> 20131001'過濾器不會在第二種情況下修剪分區?你可以發佈兩個解釋計劃嗎? –

+0

您還應該閱讀[MapJoin&Partition Pruning](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=34015666)並查看您的案例是否符合問題描述。 –

回答

0

我也經歷過同樣的事情(不知道爲什麼會這樣,錯誤或功能,我會把它當作一個bug來考慮)。由於左外連接被大量使用,我用以下解決方法:

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 ... ...將是有趣的,如果我們在後面固定在版本。

0

查詢1表B是保存表,所以B的謂詞是下推式。

查詢2表B中不保留表,所以B的地方謂語不會pushdown.hive將 掃描整個表B中

看到本作更詳細OuterJoinBehavior

相關問題