Hive Hive的三種Join方式

2021-10-02 12:47:13 字數 1291 閱讀 2598

hive中的join可分為三種,分別是map-join、reduce-join和smb join,本文簡單介紹這三種join的原理和機制。

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

當我們將小表放入記憶體中時,這個小表具體有多小,是由hive.mapjoin.smalltable.filesize引數決定的。該引數的預設值為10m。hive0.7之前,需要使用hint提示 /*+ mapjoin(table) */才會執行mapjoin,否則執行common join,但在0.7版本之後,預設自動會轉換map join,由引數hive.auto.convert.join來控制,預設為true.借鑑網上的一張圖來表示map-join

reduce-join又叫做shuffle-join和common-join。如果不指定mapjoin或者不符合mapjoin的條件,那麼hive解析器會將join操作轉換成common join,即:在reduce階段完成join.

整個過程包含map、shuffle、reduce階段。

讀取源表的資料,map輸出時候以join on條件中的列為key,如果join有多個關聯鍵,則以這些關聯鍵的組合作為key; map輸出的value為join之後所關心的(select或者where中需要用到的)列;同時在value中還會包含表的tag資訊,用於標明此value對應哪個表;按照key進行排序

根據key的值進行hash,並將key/value按照hash值推送至不同的reduce中,這樣確保兩個表中相同的key位於同乙個reduce中

smb 存在的目的主要是為了解決大表與大表間的 join 問題,分桶其實就是把大表化成了「小表」,然後 map-side join 解決之,這是典型的分而治之的思想。

set hive.enforce.bucketing=true;

set hive.enforce.sorting=true;

表優化資料目標:相同資料盡量聚集在一起

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