Hive的join語句

                       Hive的join語句

目錄

一、INNER JOIN(Hive默認的JOIN)

二、JOIN優化

三、LEFT OUTER JOIN

四、RIGHT OUTER JOIN

五、FULL OUTER JOIN

六、LEFT SEMI-JOIN

七、笛卡爾積 JOIN

八、map-side JOIN


一、INNER JOIN(Hive默認的JOIN)

只有進行連接的兩個表中都存在與連接標準相匹配的數據纔會被保留下來。
如下圖:ymd字段內容必須相等,它是這個查詢語句中的連接關鍵字。當join別的表,如果本表該字段有數據,別的表對應的爲null,那麼該數據將匹配不到。

同時,Hive目前還不支持在ON子句中的謂詞間使用OR,但可以使用AND。
例如: select * from a join b on a.word = b.word and a.size = b.size;
當涉及到多個表的join時,hive總是按照從左到右的順序執行的。


二、JOIN優化

當對3個或者更多個表進行join連接時,如果每個on子句都使用相同的連接鍵的話,那麼只會產生一個MapReduce job。
否則,當兩張表join時,產生一個MapReduce job, 再與第三張表join時又會產生新的MapReduce job。
在對每行記錄進行連接操作時,它會嘗試將其他表緩存起來,然後掃描最後那個表進行計算。優化時最好保證連續查詢中的表的大小從左到右是依次增加的。
數據集大的話,這樣優化的性能比較明顯。也可以用一個“標記”機制來顯式地告知查詢優化器哪張表是大表。如下圖:
 

現在Hive將會嘗試將表stocks作爲驅動表,即使其在查詢中不是位於最後面的。


三、LEFT OUTER JOIN

在這種join連接操作中,join操作符左邊表中符合where子句的所有記錄將會被返回。join操作符右邊中如果沒有符合on後面連接條件的記錄時,那麼從右邊表指定選擇的列的值將會是NULL。

四、OUTER JOIN
對於外連接,where語句在連接操作(join)執行後纔會執行where過濾,因此where語句應該只用於過濾那些非NULL值的列值。
舉個例子:

爲了提高前面那個查詢的執行速度,增加了謂詞限定,這時會影響輸出結果,變成了和之前的內連接一樣的結果。
解決方案:使用嵌套select語句:


四、RIGHT OUTER JOIN

在這種join連接操作中,join操作符右邊表中符合where子句的所有記錄將會被返回。join操作符左邊中如果沒有符合on後面連接條件的記錄時,那麼從左邊表指定選擇的列的值將會是NULL。

 

五、FULL OUTER JOIN

如果任一表的指定字段沒有符合條件的值的話,那麼就使用NUL值進行替換。


六、LEFT SEMI-JOIN

效果比通常的INNER JOIN要更高效。原因如下:對於左表中一條指定的記錄,在右邊表中一旦找到匹配的記錄,Hive就會立即停止掃描,進行左表下一條指令的匹配。
用法:SELECT 和WHERE 語句中不能引用到右表中的字段。Hive只支持左半開,不支持右半開。
例子:
 


七、笛卡爾積 JOIN

左邊表有5行數據,右邊表有6行數據,產生的結果將是30行數據:

select * fromstocks join dividends;

執行笛卡爾積join,這個過程經常會消耗很長的時間,運行緩慢。
如果設置屬性hive.mapred.mode值爲strict的話,Hive會阻止用戶執行笛卡爾積查詢。


八、map-side JOIN

當所有表中只有一張表是小表,可以在最大的表通過mapper的時候將小表完全放到內存中,與內存中的小表進行逐一匹配,省略掉常規鏈接操作所需要的reduce過程,有時還可以同時減少map過程的執行步驟。
在Hive v0.7之前的版本,需要增加一個標記來觸發。

之後的版本廢棄了這種標記方式,通過設置屬性hive.auto.convert.join,默認值是false,需要開啓。

配置能夠使用這個優化的小表的大小:

hive.mapjoin.smalltable.filesize = 25000000

如果需要自動啓動這個優化,可以將這些屬性設置在$HOME/.hiverc文件中。
對於right out join 和 full outer join 不支持這個優化。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章