多语言展示
当前在线:1024今日阅读:195今日分享:41

hive优化之mapjoin

根据mapjoin的计算原理,MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配。这种情况下即使笛卡尔积也不会对任务运行速度造成太大的效率影响。
工具/原料
1

HIVE

2

HIVE、HADOOP

方法/步骤
1

mapjoin的应用场景如下:1.有一个极小的表<1000行2: 需要做不等值join的where操作(a.x < b.y 或者 a.x like b.y等,注:目前版本join下不支持不等值操作,不等值需加到where条件里)如果把不等于写到where里会造成笛卡尔积,如果数据量很大,笛卡尔积的后果不可想象,速度可能慢的惊人!根据mapjoin的计算原理,MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配。这种情况下即使笛卡尔积也不会对任务运行速度造成太大的效率影响。而且hive的where条件本身就是在map阶段进行的操作,所以在where里写入不等值比对的话,也不会造成额外负担。如此看来,使用MAPJOIN开发的程序仅仅使用map一个过程就可以完成不等值join操作,效率还会有很大的提升。案例讲解:老板要显示会员每天的交易记录,没有记录的要显示0,数据库中没有交易的根本不会显示这条,怎么会显示为0呢,没办法,只能用会员每天汇总信息关联时间维表了。测试数据请下载:会员每天交易信息汇总,16万左右数据: http://pan.baidu.com/s/1qWjp4ok时间维表信息: http://pan.baidu.com/s/1c0iYavY

2

create table hive_mapjoin (id string,dt string,amt double)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n';create table hive_dt (dt string);load data local inpath '/data/tmp/tqc/hive_mapjoin.txt' overwrite into table tmp.hive_mapjoin;load data local inpath '/data/tmp/tqc/hive_dt.txt' overwrite into table tmp.hive_dt;

3

测试sql如下:[code]--无mapjoincreate table hive_no_mapjoin asselect f.id,f.dt, coalesce(k.amt,0.0) amtfrom(--求会员有交易以来的连续时间select  a.id,t.dtfrom hive_dt tjoin (--求会员交易最小时间select id,  min(dt) min_dtfrom hive_mapjoingroup by id)awhere  t.dt>= a.min_dt) fleft outer join tmp.tst1 kon f.dt = k.dt and f.id = k.id;--有mapjoincreate table hive_ok_mapjoin asselect f.id,f.dt, coalesce(k.amt,0.0) amtfrom(--求会员有交易以来的连续时间select /*+ mapjoin(t) */ a.id,t.dtfrom hive_dt tjoin (--求会员交易最小时间select id,  min(dt) min_dtfrom hive_mapjoingroup by id)awhere  t.dt>= a.min_dt) fleft outer join tmp.tst1 kon f.dt = k.dt and f.id = k.id;

4

测试结果:无mapjoin执行3分钟,有mapjoin执行2分钟结果分析:样本数据太少,不到20万数据,小表数据不足200条,最终结果只有200多万。hive处理这点数据还是很轻松的,大家如果测试,建议数据量要大些,至少执行结果千万条以上才能看出效果

注意事项
1

小表在前,数据量不要大于200M

2

大表不要太小,太小了意义不大

推荐信息