巧用MapJoin解决数据倾斜的问题:
Hive的MapJoin理解:
join的操作是在map阶段完成后,如果需要的数据在map的过程中可以访问到则就不再需要reduce了。
例如:
小表关联一个超大表时,容易发生数据倾斜,可以使用Mapjoin把小表全部加载到内存,在map端进行join,避免reduce处理
代码:
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(表的名字)*/
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;
数据倾斜的时候,常常如上面这么使用
在25M以内的数据都是小表:
hive.mapjoin.smalltable.filesize=25000000