Hive MapJoin

摘要

MapJoin是Hive的一种优化操做,其适用于小表JOIN大表的场景,因为表的JOIN操做是在Map端且在内存进行的,因此其并不须要启动Reduce任务也就不须要通过shuffle阶段,从而能在必定程度上节省资源提升JOIN效率优化

 
使用
方法一:
在Hive0.11前,必须使用MAPJOIN来标记显示地启动该优化操做,因为其须要将小表加载进内存因此要注意小表的大小
SELECT /*+ MAPJOIN(smalltable)*/  .key,value
FROM smalltable JOIN bigtable ON smalltable.key = bigtable.key
方法二
在Hive0.11后,Hive默认启动该优化,也就是不在须要显示的使用MAPJOIN标记,其会在必要的时候触发该优化操做将普通JOIN转换成MapJoin,能够经过如下两个属性来设置该优化的触发时机
hive.auto.convert.join
默认值为true,自动开户MAPJOIN优化
hive.mapjoin.smalltable.filesize
默认值为2500000(25M),经过配置该属性来肯定使用该优化的表的大小,若是表的大小小于此值就会被加载进内存中
 
注意:使用默认启动该优化的方式若是出现默名奇妙的BUG(好比MAPJOIN并不起做用),就将如下两个属性置为fase手动使用MAPJOIN标记来启动该优化
hive.auto.convert.join=false(关闭自动MAPJOIN转换操做)
hive.ignore.mapjoin.hint=false(不忽略MAPJOIN标记)
 
对于如下查询是不支持使用方法二(MAPJOIN标记)来启动该优化的
select /*+MAPJOIN(smallTableTwo)*/ idOne, idTwo, value FROM
  ( select /*+MAPJOIN(smallTableOne)*/ idOne, idTwo, value FROM
    bigTable JOIN smallTableOne on (bigTable.idOne = smallTableOne.idOne)                                                  
  ) firstjoin                                                            
  JOIN                                                                 
  smallTableTwo ON (firstjoin.idTwo = smallTableTwo.idTwo)  
可是,若是使用的是方法一即没有MAPJOIN标记则以上查询语句将会被做为两个MJ执行,进一步的,若是预先知道表大小是可以被加载进内存的,则能够经过如下属性来将两个MJ合并成一个MJ
hive.auto.convert.join.noconditionaltask:Hive在基于输入文件大小的前提下将普通JOIN转换成MapJoin,并是否将多个MJ合并成一个
hive.auto.convert.join.noconditionaltask.size:多个MJ合并成一个MJ时,其表的总的大小须小于该值,同时hive.auto.convert.join.noconditionaltask必须为true
相关文章
相关标签/搜索