如何理解Map Join

MapJoin是在Map阶段执行的表连接优化技术,适用于小表与大表连接的情况,尤其是不等值连接。它避免了Shuffle阶段的数据传输,提高了大数据处理效率。在Hive中,当小表数据量足够小且满足条件时,Hive会自动或通过hint转换为MapJoin。然而,MapJoin并不适用于所有JOIN类型,如FULL OUTER JOIN,并且受制于内存限制和小表数量(最多6张)。

MapJoin顾名思义,就是在Map阶段进行表之间的连接。而不需要进入到Reduce阶段才进行连接。这样就节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用。
要使MapJoin能够顺利进行,那就必须满足这样的条件:除了一份表的数据分布在不同的Map中外,其他连接的表的数据必须在每个Map中有完整的拷贝。 所以并不是所有的场景都适合用MapJoin。它通常会用在如下的一些情景:在二个要连接的表中,有一个很大,有一个很小,这个小表可以存放在内存中而不影响性能。这样我们就把小表文件复制到每一个Map任务的本地,再让Map把文件读到内存中待用。
在Hive v0.7之前,需要使用hint提示 /*+ mapjoin(table) */才会执行MapJoin。Hive v0.7之后的版
本已经不需要给出MapJoin的指示就进行优化。现在可以通过如下配置参数来进行控制:

set hive.auto.convert.join=true;
   Hive还提供另外一个参数--表文件的大小作为开启和关闭MapJoin的阈值:
--旧版本为hive.mapjoin.smalltable.filesize
set hive.auto.convert.join.noconditionaltask.size=512000000

注意,如果hive.auto.convert.join是关闭的,则本参数不起作用。否则,如果参与连接的N个表(或分区)中的N-1个 的总大小小于512MB,则直接将连接转为Map连接。默认值为20MB。
在这里插入图片描述
MapJoin的使用场景:
1. 关联操作中有一张表非常小 2. 不等值的链接操作
(1)大小表关联

select f.a,f.b from A t join B f on ( f.a=t.a and f.ftime=20110802)

该语句中B表有30亿行记录,A表只有100行记录,而且B表中数据倾斜特别严重,有一个key上有15亿行记录,在运行过程中特别的慢,而且在reduece的过程中遇到执行时间过长或者内存不够的问题。
MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map时进行了join操作,省去了reduce运行的效率会高很多。
这样就不会由于数据倾斜导致某个reduce上落数据太多而失败。于是原来的sql可以通过使用hint的方式指定join时使用mapjoin。

select /*+ mapjoin(A)*/ f.a,f.b from A t join B f on ( f.a=t.a and f.ftime=20110802)

在实际使用中,只要根据业务调整小表的阈值即可,hive会自动帮我们完成mapjoin,提高执行的效率。
(2)不等连接
mapjoin还有一个很大的好处是能够进行不等连接的join操作,如果将不等条件写在where中,那么mapreduce过程中会进行笛卡尔积,运行效率特别低,如果使用mapjoin操作,在map的过程中就完成了不等值的join操作,效率会高很多。

select A.a ,A.b from A join B where A.a>B.a

(3)使用限制
LEFT OUTER JOIN的左表必须是大表;
RIGHT OUTER JOIN的右表必须是大表;
INNER JOIN左表或右表均可以作为大表;
FULL OUTER JOIN不能使用MAPJOIN;
MAPJOIN支持小表为子查询;
使用MAPJOIN时需要引用小表或是子查询时,需要引用别名;
在MAPJOIN中,可以使用不等值连接或者使用OR连接多个条件;
在MAPJOIN中最多支持指定6张小表,否则报语法错误;
如果使用MAPJOIN,则所有小表占用的内存总和不得超过设置的内存(解压后的逻辑数据量)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值