1. 程式人生 > >hive使用技巧(四)——巧用MapJoin解決資料傾斜問題

hive使用技巧(四)——巧用MapJoin解決資料傾斜問題

相關文章推薦:

Hive的MapJoin,在Join 操作在 Map 階段完成,如果需要的資料在 Map 的過程中可以訪問到則不再需要Reduce。
小表關聯一個超大表時,容易發生資料傾斜,可以用MapJoin把小表全部載入到記憶體在map端進行join,避免reducer處理。

實則分析

select c.channel_name,count(t.requesturl) PV
 from ods.cms_channel c
 join
 (select host,requesturl from  dms.tracklog_5min where day='20151111' ) t
 on c.channel_name=t.host
 group by c.channel_name
 order by c.channel_name;

上以為小表join大表的操作,可以使用mapjoin把小表放到記憶體中處理,語法很簡單隻需要增加 /*+ MAPJOIN(pt) */ ,把需要分發的表放入到記憶體中
select /*+ MAPJOIN(c) */
c.channel_name,count(t.requesturl) PV
 from ods.cms_channel c
 join
 (select host,requesturl from  dms.tracklog_5min where day='20151111' ) t
 on c.channel_name=t.host
 group by c.channel_name
 order by c.channel_name;

這種用在出現資料傾斜時經常使用

引數說明:

1)如果是小表,自動選擇Mapjoin:

set hive.auto.convert.join = true; # 預設為false
該引數為true時,Hive自動對左邊的表統計量,如果是小表就加入記憶體,即對 小表使用Map join


2)大表小表的閥值:

set hive.mapjoin.smalltable.filesize;
hive.mapjoin.smalltable.filesize=25000000
預設值是25mb

3)map join做group by 操作時,可以使用多大的記憶體來儲存資料,如果資料太大,則不會儲存在記憶體裡

set hive.mapjoin.followby.gby.localtask.max.memory.usage;
預設值:0.55

4)本地任務可以使用記憶體的百分比

set hive.mapjoin.localtask.max.memory.usage;
預設值: 0.90