Hive Sort Merge Bucket Map Join

测试:一个4000万和一个5000多万的表Join,关联键数据倾斜,并且笛卡尔积,效果明显。


#建立小表

create table lxw_test1(id int,name string,date_time string)
clustered by(id) sorted by(id) into 10 buckets;

#建立大表

create table lxw_test2(id int,name string,date_time string)
clustered by(id) sorted by(id) into 5 buckets;


注:两个表关联键为id,需要按id分桶并且做排序,小表的分桶数是大表分桶数的倍数。


#启用桶表

set hive.enforce.bucketing = true;

#往小表中插入4000万条记录

insert overwrite table lxw_test1
  select id,name,null  
  from woa_all_user_info_his 
  where pt = '2012-05-28'
  limit 40000000;

#往大表中插5000多万条记录(woa_all_user_info_his中有5000多万条记录)
insert overwrite table lxw_test2
 select id,name,date_time
 from woa_all_user_info_his
 where pt = '2012-05-28';

#设置Sort Merge Bucket Map Join的参数

set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;

注:此时的状况是Bucket columns==Join Columns==Sort Columns,完全具备具备使用Sort Merge Bucket Map Join的条件。


#查询

select /*+ mapjoin(b) */ count(1)
from lxw_test1 a 
join lxw_test2 b
on a.id = b.id 

测试结果:

包括insert数据,采用Sort Merge Bucket Map Join的方式耗时10分钟左右。

如果这两个表做普通的join,耗时1个多小时,还跑不完,最后只得Kill掉了!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值