1 概述
若所有表中只有一張小表,那可在最大的表通過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語法解析會直接拋出錯誤。
select /*+ MAPJOIN(a)*/
a.name, b.stu_id
from student_table_small a
join student_table_big b
where b.age>=a.age
2 相關參數
2.1 小表自動選擇Mapjoinset 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