MapJoin顾名思义,就是在Map阶段进行表之间的连接。而不需要进入到reduce阶段才进行连接。这样就节省了在shuffle阶段时要进行的大量数据传输。从而起到优化作业的作用。
原理:即在map端进行join,其原理是broadcast join,即会把小表作为一个完整的驱动表来进行join操作。通常情况下,要连接的各个表里面的数据会分布在不同的Map中进行处理。即同一个Key对应的Value可能存在不同的Map中。这样就必须等到Reduce中去连接。要使MapJoin能够顺利进行,那就必须满足这样的条件:除了一份表的数据分布在不同的Map中国外,其他连接的表的数据必须在每一个Map中有完整的拷贝。MapJoin会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了reduce运行的效率也会高很多。
MapJoin的适用场景如关联操作中有一张表非常小,不等值的链接操作。通过上面分析可以发现,并不是所有的场景都适合用MapJoin。它通常会用在如下的一些情景:在两个要连接的表中,有一个很大,有一个很小,这个小表可以存放在内存中而不影响性能,这样我们就把小表文件复制到每一个Map任务的本地,再让Map把文件读到内存中待用。