频道栏目
首页 > 资讯 > 云计算 > 正文

hive使用技巧(四)——巧用MapJoin解决数据倾斜问题

16-08-16        来源:[db:作者]  
收藏   我要投稿

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
相关TAG标签
上一篇:第4课:SparkStreaming的Exactly-One的事务处理和不重复输出彻底掌握
下一篇:ubuntu14.04手动安装qemu和libvirt
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站