最近開發中遇到幾種應用,恰好使用MAPJOIN來解決實際的問題。 html
應用共同點以下: sql
1: 有一個極小的表<1000行 spa
2: 須要作不等值join操做(a.x < b.y 或者 a.x like b.y等) code
這種操做若是直接使用join的話語法不支持不等於操做,hive語法解析會直接拋出錯誤 htm
若是把不等於寫到where裏會形成笛卡爾積,數據異常增大,速度會很慢。甚至會任務沒法跑成功~ blog
根據mapjoin的計算原理,MAPJION會把小表所有讀入內存中,在map階段直接拿另一個表的數據和內存中表數據作匹配。這種狀況下即便笛卡爾積也不會對任務運行速度形成太大的效率影響。 內存
並且hive的where條件自己就是在map階段進行的操做,因此在where裏寫入不等值比對的話,也不會形成額外負擔。 ci
如此看來,使用MAPJOIN開發的程序僅僅使用map一個過程就能夠完成不等值join操做,效率還會有很大的提高。 開發
問題解決~~ get
示例代碼以下:
1: select /*+ MAPJOIN(a) */ 2: a.start_level, b.* 3: from dim_level a 4: join (select * from test) b 5: where b.xx>=a.start_level and b.xx<end_level;
推薦閱讀:
Hive 隨談(四)– Hive QL
http://www.alidata.org/archives/581
hive使用經驗