籠統的說,hive中的join可分為common join(reduce階段完成join)和map join(map階段完成join)。本文簡單介紹一下兩種join的原理和機制。
1 hive common 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為例,**其過程:
select
a.id,a.dept,b.age
from a join b
on (a.id = b.id);
看了這個圖,應該知道如何使用mapreduce進行join操作了吧。
2 hive map join
mapjoin通常用於乙個很小的表和乙個大表進行join的場景,具體小表有多小,由引數hive.mapjoin.smalltable.filesize來決定,該引數表示小表的總大小,預設值為25000000位元組,即25m。
hive0.7之前,需要使用hint提示 /*+ mapjoin(table) */才會執行mapjoin,否則執行common join,但在0.7版本之後,預設自動會轉換map join,由引數hive.auto.convert.join來控制,預設為true.
仍然以9.1中的hql來說吧,假設a表為一張大表,b為小表,並且hive.auto.convert.join=true,那麼hive在執行時候會自動轉化為mapjoin。
如圖中的流程,首先是task a,它是乙個local task(在客戶端本地執行的task),負責掃瞄小表b的資料,將其轉換成乙個hashtable的資料結構,並寫入本地的檔案中,之後將該檔案載入到 distributecache中,該hashtable的資料結構可以抽象為:
keyvalue126
234圖中紅框圈出了執行local task的資訊。
接下來是task b,該任務是乙個沒有reduce的mr,啟動maptasks掃瞄大表a,在map階段,根據a的每一條記錄去和distributecache中b表對應的hashtable關聯,並直接輸出結果。
由於mapjoin沒有reduce,所以由map直接輸出結果檔案,有多少個map task,就有多少個結果檔案。
Hive中Join的原理和機制
籠統的說,hive中的join可分為common join reduce階段完成join 和map join map階段完成join 本文簡單介紹一下兩種join的原理和機制。如果不指定mapjoin或者不符合mapjoin的條件,那麼hive解析器會將join操作轉換成common join,即 ...
Hive中Join的原理和機制
籠統的說,hive中的join可分為common join reduce階段完成join 和map join map階段完成join 本文簡單介紹一下兩種join的原理和機制。如果不指定mapjoin或者不符合mapjoin的條件,那麼hive解析器會將join操作轉換成common join,即 ...
Hive中Join的 MR 底層原理
hive中的join可分為common join reduce階段完成join 和map join map階段完成join 如果不指定mapjoin或者不符合mapjoin的條件,那麼hive解析器會將join操作轉換成common join,即 在reduce階段完成join.整個過程包含map ...