Hive中Mapjoin的使用

来源:互联网 发布:拳皇13半圆优化 编辑:程序博客网 时间:2024/05/17 05:13

        顾名思义 MapJoin是在Map端完成Join操作,需要将Join操作中的小表读入到内存,在Map阶段拿另外一个表一个表的数据和内存中表数据做匹配,这种情况下即使笛卡尔积也不会对任务运行速度造成太大的效率影响。

应用1:共同点:

1、有个较小的表(<1000);

2、需要做不等值join操作(a.x < b.y 或者 a.x like b.y等);

而且hive的where条件本身就是在map阶段进行的操作,所以在where里写入不等值比对的话,也不会造成额外负担。如此看来,使用MapJoin开发的程序仅仅使用map一个过程就可以完成不等值join操作,效率还会有很大的提升。

代码示例:

   1: select /*+ MAPJOIN(a) */
   2: a.start_level, b.*
   3: from dim_level a
   4: join (select * from test) b
   5: where b.xx>=a.start_level and b.xx<end_level;

应用2:hive的排序关键字是sort by,与order by区别在于sort by只能在单机范围内排序。

如:create table pv_users(

pages_id int,

username string,

time datetime,

visit_count int,

stay_time string

) partition by(ds string);

在表中查询所有记录,并按访问次数和id排序:

set mapred.reduce.tasks=2;

select * from pv_users sort by visit_count,pages_id;

这一查询可能指定的2个reducer分发到的数据可能是各自排序,因为没有reduce key,hive会随机生成作为reduce key,因为这样也被随机分发到不同的机子上个了。但依然存在问题。

解决:

1.不分发数据,使用单个reducer;

set mapred.reduce.tasks=1;

但容易造成性能瓶颈,数据量大的时候一般无法得到

2.在select关键词加/*+mapjoin(tablelist)*/提示优化器转化成为MapJoin(目前Hive优化器不能自动转化MapJoin)。其中tablelist可以是一个表,或逗号连接的表的列表,此表会被读入内存,因此小表写在这里。

注:给join添加join key,规避笛卡尔积时出现的Bug。



ps:内容参考量子恒道博客内容,致以感谢。


原创粉丝点击