若所有表中隻有一張小表,那可在最大的表通過mapper的時候将小表完全放到記憶體中,hive可以在map端執行連接配接過程,稱為map-side join,這是因為hive可以和記憶體的小表逐一比對,進而省略掉正常連接配接所需的reduce過程。即使對于很小的資料集,這個優化也明顯地要快于正常的連接配接操作。其不僅減少了reduce過程,而且有時還可以同時減少map過程的執行步驟。
使用mapjoin可解決以下實際問題:
a 有一個極小的表<1000行(a是小表)
b 需要做不等值join操作(a.x<b.y或者a.x like b.y等)。普通join文法不支援不等于操作,hive文法解析會直接抛出錯誤。
2.1 小表自動選擇mapjoin
set hive.auto.convert.join=true;
預設值:false。該參數為true時,hive自動對左邊的表統計量,若是小表就加入記憶體,即對小表使用map join
2.2 小表閥值
set hive.mapjoin.smalltable.filesize=25000000;
預設值:25m
2.3 map join做group by操作時,可使用多大的記憶體來存儲資料。若資料太大則不會儲存在記憶體裡
set hive.mapjoin.followby.gby.localtask.max.memory.usage;
預設值:0.55
2.4 本地任務可以使用記憶體的百分比
set hive.mapjoin.localtask.max.memory.usage;
預設值:0.90
參考位址:http://blog.csdn.net/kwu_ganymede/article/details/51365002