hive中join操作

         籠統的說,Hive中的Join可分爲Common Join(Reduce階段完成join)和Map Join(Map階段完成join)。本文簡單介紹一下兩種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);


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。



但是有些表是不適合做map join的,內存不夠用有可能,入下面的錯誤


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章