hive幾種join方式

2021-09-24 19:51:10 字數 1472 閱讀 6331

hive處理表關聯時由於資料量以及資料傾斜等問題會導致計算效能差甚至任務失敗,下面記錄一下hive的幾種關聯方式。

普通連線,在sql中不特殊指定連線方式使用的都是這種普通連線。

缺點:效能較差

優點:操作簡單,普適性強

map端連線,與普通連線的區別是這個連線中不會有reduce階段存在,連線在map端完成

適用場景:大表與小表連線,小表資料量應該能夠完全載入到記憶體,否則不適用

優點:在大小表連線時效能提公升明顯,hive 0.6 的時候預設認為寫在select 後面的是大表,前面的是小表, 或者使用 /*+mapjoin(map_table) */ 提示進行設定. hive 0.7 的時候這個計算是自動化的,它首先會自動判斷哪個是小表,哪個是大表,這個引數由(hive.auto.convert.join=true)來控制. 然後控制小表的大小由(hive.smalltable.filesize=25000000l)引數控制(預設是25m),當小表超過這個大小,hive 會預設轉化成common join。

缺點:使用範圍較小,只針對大小表且小表能完全載入到記憶體中的情況

分桶連線:hive 建表的時候支援hash 分割槽通過指定clustered by (col_name,*** ) into number_buckets buckets 關鍵字.當連線的兩個表的join key 就是bucket column 的時候,就可以通過

hive.optimize.bucketmapjoin= true
來執行該優化策略。

原理:通過兩個表分桶在執行連線時會將小表的每個分桶對映成hash表,每個task節點都需要這個小表的所有hash表,但是在執行時只需要載入該task所持有大表分桶對應的小表部分的hash表就可以,所以對記憶體的要求是能夠載入小表中最大的hash塊即可。

注意點:小表與大表的分桶數量需要是倍數關係,這個是因為分桶策略決定的,分桶時會根據分桶字段對桶數取餘後決定哪個桶的,所以要保證成倍數關係。

優點:比map join對記憶體的要求降低,能在逐行對比時減少資料計算量(不用比對小表全量)

缺點:只適用於分桶表

傾斜連線,主要針對資料傾斜的情況優化

//指定每個reducer處理的資料量大小

hive.exec.reducers.bytes.per.reducer = 1000000000

//開啟傾斜優化

set hive.optimize.skewjoin = true;

//設定資料條數(每個reduce資料條數上線)

set hive.skewjoin.key = skew_key_threshold (default = 100000)

優點:處理傾斜資料可以均衡各reduce階段的資料量

左半連線:hive中對in和not in的支援不夠且該操作效率太低所以提供了替代操作left semi join

功能有限,不過多討論。

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行 那麼我們可以將資料量少的...