MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了reduce运行的效率也会高很多。
common map join
参数:
set hive.auto.convert.join=true; 是否开启map join 。hive 0.10 版本后的默认值 true。
set hive.mapjoin.smalltable.filesize =25000000 ;使用map join 的最大小表大小。
set hive.auto.convert.join.noconditionaltask = true;是否合并多个map join;
set hive.auto.convert.join.noconditionaltask.size= 100000000; 将多个mapjoin合并时,所有小表文件的累计最大大小
注意 在0.7.0版本之前:需要在sql中使用 /*+ MAPJOIN(smallTable) */ 来开启mapjoin
其他不是很重要的本地任务参数
set hive.mapjoin.localtask.max.memory.usage=0.9
: localtask将小表转成hashtable的最大内存使用率,默认0.9
set hive.mapjoin.check.memory.rows=100000
:localtask每处理完多少行,就执行内存检查。默认为100000
Bucket Map Join
除了map join条件外,还需要满足桶join的基本的条件:必须都是分桶表,一个表的分桶数量是另一个表的分桶数量的整倍数,关联的列必须是分桶列
set hive.optimize.bucketmapjoin = true
; 开启 Bucket Map Join
SMB Map Join
额外参数
# 开启 SMB Join
set hive.auto.convert.sortmerge.join=true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
set hive.auto.convert.sortmerge.join.noconditionaltask=true;
#跟上面一样开启桶Map Joinset hive.optimize.bucketmapjoin = true;
set hive.enforce.sorting=true;#强制排序
#author 炼数成器