Hive Sort Merge Bucket Map Join

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

 

#建立小表

 

[java]  view plain  copy
 
  1. create table lxw_test1(id int,name string,date_time string)  
  2. clustered by(id) sorted by(id) into 10 buckets;  


#建立大表

 

 

[java]  view plain  copy
 
  1. create table lxw_test2(id int,name string,date_time string)  
  2. clustered by(id) sorted by(id) into 5 buckets;  

 

 

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


#启用桶表

 

[java]  view plain  copy
 
  1. set hive.enforce.bucketing = true;  


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

 

 

[java]  view plain  copy
 
  1. insert overwrite table lxw_test1  
  2.   select id,name,null    
  3.   from woa_all_user_info_his   
  4.   where pt = '2012-05-28'  
  5.   limit 40000000;  


#往大表中插5000多万条记录(woa_all_user_info_his中有5000多万条记录)

[java]  view plain  copy
 
  1. insert overwrite table lxw_test2  
  2.  select id,name,date_time  
  3.  from woa_all_user_info_his  
  4.  where pt = '2012-05-28';  

 

 

#设置Sort Merge Bucket Map Join的参数

 

[java]  view plain  copy
 
  1. set hive.optimize.bucketmapjoin = true;  
  2. set hive.optimize.bucketmapjoin.sortedmerge = true;  
  3. set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;  


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

 

 

#查询

 

[java]  view plain  copy
 
  1. select /*+ mapjoin(b) */ count(1)  
  2. from lxw_test1 a   
  3. join lxw_test2 b  
  4. on a.id = b.id   

 

 

测试结果:

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

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

你可能感兴趣的:(Hive Sort Merge Bucket Map Join)