一、描述
- MapJoin顾名思义,就是在Map阶段进行表之间的连接。而不需要进入到Reduce阶段才进行连接。这样就节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用。
二、使用条件
- 除了一份表的数据分布在不同的Map中外,其他连接的表的数据必须在每个Map中有完整的拷贝。
- 在二个要连接的表中,有一个很大,有一个很小,这个小表可以存放在内存中而不影响性能。
三、配置项
-- 是否开启join优化
set hive.auto.convert.join=true;
--表文件的大小作为开启和关闭MapJoin的阈值
set hive.auto.convert.join.noconditionaltask.size=512000000
四、大小表关联
该语句中B表有30亿行记录,A表只有100行记录,而且B表中数据倾斜特别严重,有一个key上有15亿行记录,在运行过程中特别的慢,而且在reduece的过程中遇到执行时间过长或者内存不够的问题。
MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map时进行了join操作,省去了reduce运行的效率会高很多。这样就不会由于数据倾斜导致某个reduce上落数据太多而失败。于是原来的sql可以通过使用hint的方式指定join时使用mapjoin。
-- 原sql语句
select f.a,f.b from A t join B f on ( f.a=t.a and f.ftime=20110802)
-- 使用mapjoin优化
select /*+ mapjoin(A)*/ f.a,f.b from A t join B f on ( f.a=t.a and f.ftime=20110802)
五、不等连接
mapjoin还有一个很大的好处是能够进行不等连接的join操作,如果将不等条件写在where中,那么mapreduce过程中会进行笛卡尔积,运行效率特别低,如果使用mapjoin操作,在map的过程中就完成了不等值的join操作,效率会高很多。
select A.a ,A.b from A join B where A.a> >B.a