Hive中join的三種方式

2021-08-08 16:45:52 字數 1417 閱讀 3046

hive在實際的應用過程中,大部份分情況都會涉及到不同的**的連線,例如在進行兩個table的join的時候,利用mr的思想會消耗大量的記憶體,良妃磁碟的io,大幅度的影響效能,因為shuffle真的好令人擔心啊,總之,就是各種問題都是由他產生的。下面介紹一下涉及hive在join的時候的優化方式

第一:在map端產生join

mapjoin的主要意思就是,當鏈結的兩個表是乙個比較小的表和乙個特別大的表的時候,我們把比較小的table直接放到記憶體中去,然後再對比較大的**進行map操作。join就發生在map操作的時候,每當掃瞄乙個大的table中的資料,就要去去檢視小表的資料,哪條與之相符,繼而進行連線。這裡的join並不會涉及reduce操作。map端join的優勢就是在於沒有shuffle,真好。在實際的應用中,我們這樣設定:

[sql]view plain

copy

set hive.auto.convert.join=true;  

這樣設定,hive就會自動的識別比較小的表,繼而用mapjoin來實現兩個表的聯合。看看下面的兩個**的連線。這裡的dept相對來講是比較小的。我們看看會發生什麼,如圖所示:

注意看啦,這裡的第一句話就是執行本地的map join任務,繼而轉存檔案到***.hashtable下面,在給這個檔案裡面上傳乙個檔案進行map join,之後才執行了mr**去執行計數任務。說白了,在本質上mapjoin根本就沒有執行mr程序,僅僅是在記憶體就進行了兩個表的聯合。具體執行如下圖:

common join也叫做shuffle join,reduce join操作。這種情況下生再兩個table的大小相當,但是又不是很大的情況下使用的。具體流程就是在map端進行資料的切分,乙個block對應乙個map操作,然後進行shuffle操作,把對應的block shuffle到reduce端去,再逐個進行聯合,這裡優勢會涉及到資料的傾斜,大幅度的影響效能有可能會執行speculation,這塊兒在後續的資料傾斜會講到。因為平常我們用到的資料量小,所以這裡就不具體演示了。

第三:smbjoin

smb是sort  merge bucket操作,首先進行排序,繼而合併,然後放到所對應的bucket中去,bucket是hive中和分割槽表類似的技術,就是按照key進行hash,相同的hash值都放到相同的buck中去。在進行兩個表聯合的時候。我們首先進行分桶,在join會大幅度的對效能進行優化。也就是說,在進行聯合的時候,是table1中的一小部分和table1中的一小部分進行聯合,table聯合都是等值連線,相同的key都放到了同乙個bucket中去了,那麼在聯合的時候就會大幅度的減小無關項的掃瞄。

Hive的三種Join方式

reduce join在hive中也叫common join或shuffle join 如果兩邊資料量都很大,它會進行把相同key的value合在一起,正好符合我們在sql中的join,然後再去組合,如圖所示。1 大小表連線 如果一張表的資料很大,另外一張表很少 1000行 那麼我們可以將資料量少的...

Hive的三種Join方式

hive reduce join在hive中也叫common join或shuffle join 如果兩邊資料量都很大,它會進行把相同key的value合在一起,正好符合我們在sql中的join,然後再去組合,如圖所示。1 大小表連線 如果一張表的資料很大,另外一張表很少 1000行 那麼我們可以將...

Hive的三種Join方式

reduce join在hive中也叫common join或shuffle join 如果兩邊資料量都很大,它會進行把相同key的value合在一起,正好符合我們在sql中的join,然後再去組合,如圖所示。1 大小表連線 如果一張表的資料很大,另外一張表很少 1000行 那麼我們可以將資料量少的...