Hive中使用MAP JOIN

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 小表自動選擇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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章