hive中的join可分為common join
(reduce階段完成join)和map join
(map階段完成join)
如果不指定mapjoin
或者不符合mapjoin
的條件,那麼hive解析器會將join操作轉換成common join,即:在reduce階段完成join.
整個過程包含map、shuffle、reduce階段。
map階段
讀取源表的資料,map輸出時候以 join on 條件中的列為作為key,如果join有多個關聯鍵,則以這些關聯鍵的組合作為key;
map輸出的 value 為 join 之後所關心的(select或者where中需要用到的)列;同時在value中還會包含表的 tag 資訊,用於標明此value對應哪個表;
按照key進行排序;
shuffle階段
根據key的值進行hash,並將key/value按照hash值推送至不同的reduce中,這樣確保兩個表中相同的key位於同乙個reduce中
reduce階段
根據key的值完成join操作,期間通過tag來識別不同表中的資料。
以下面的hql為例,**其過程:
看了這個圖,應該知道如何使用mapreduce進行join操作了吧。
mapjoin
通常用於乙個很小的表和乙個大表進行 join 的場景,具體小表有多小,由引數hive.mapjoin.smalltable.filesize
來決定,該引數表示小表的總大小,預設值為25000000位元組,即25m
。
0.7版本之後,預設自動會轉換map join,由引數hive.auto.convert.join
來控制,預設為true.
仍然以前面的hql來說吧,假設a表為一張大表,b為小表,並且hive.auto.convert.join=true
,那麼hive在執行時候會自動轉化為mapjoin
。
如圖中的流程,首先是task a,它是乙個local task(在客戶端本地執行的task),負責掃瞄小表b的資料,將其轉換成乙個hashtable
的資料結構,並寫入本地的檔案中,之後將該檔案載入到distributecache
中,該hashtable
的資料結構可以抽象為:
圖中紅框圈出了執行local task的資訊。
接下來是task b,該任務是乙個沒有reduce的mr,啟動maptasks掃瞄大表a,在map階段,根據 a 的每一條記錄去和distributecache中 b 表對應的 hashtable 關聯,並直接輸出結果。
由於 mapjoin 沒有reduce,所以由 map直接輸出結果檔案,有多少個map task,就有多少個結果檔案。
hive中join的 mr 底層原理_康師傅沒有眼淚-csdn部落格
大表join小表,獨鍾愛mapjoin
Hive中的Join操作
hive中有許多的join操作,如果left,right和full outer join,inner join,left semi join等。那麼它們都各自有什麼特點呢?感覺很難說明這些區別,還是通過例子來看。如果我們有乙個表,資料如下 a.txt 1,a 2,b3,c 4,d7,y 8,u另乙個...
HIVE中的join語句
hive支援通常的sql join語句,但是只支援等值連線。1.1 inner join 只有進行連線的兩個表都存在與連線標準相匹配的資料才會儲存下來 select a.ymd a.price b.price from stocks a join stocks b on a.ymd b.ymd wh...
hive避免MR的情況
什麼情況下hive可以避免進行mapreduce hive 為了執行效率考慮,簡單的查詢,就是只是select,不帶count,sum,group by這樣的,都不走map reduce,直接讀取hdfs目錄中的檔案進行filter過濾。sql select from employee sql se...