黑猴子的家:Hive 表的优化之MapJoin

如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

1、开启MapJoin参数设置

(1)设置自动选择Mapjoin

//默认为true
set hive.auto.convert.join = true; 

(2)大表小表的阀值设置(默认25M一下认为是小表):

set hive.mapjoin.smalltable.filesize=25000000;

2、MapJoin工作机制

黑猴子的家:Hive 表的优化之MapJoin

首先是Task A,它是一个Local Task(在客户端本地执行的Task),负责扫描小表b的数据,将其转换成一个HashTable的数据结构,并写入本地的文件中,之后将该文件加载到DistributeCache中。

接下来是Task B,该任务是一个没有Reduce的MR,启动MapTasks扫描大表a,在Map阶段,根据a的每一条记录去和DistributeCache中b表对应的HashTable关联,并直接输出结果。

由于MapJoin没有Reduce,所以由Map直接输出结果文件,有多少个Map Task,就有多少个结果文件。

案例实操

(1)开启Mapjoin功能

//默认为true
hive > set hive.auto.convert.join = true; 

(2)执行小表JOIN大表语句

hive > insert overwrite table jointable
       select b.id, b.time, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
       from smalltable s
       join bigtable  b
       on s.id = b.id;

Time taken: 24.594 seconds

(3)执行大表JOIN小表语句

hive > insert overwrite table jointable
       select b.id, b.time, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
       from bigtable  b
       join smalltable  s
       on s.id = b.id;

Time taken: 24.315 seconds