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
相關文章
相關標籤/搜索