【hive 非等值連線】Hive 中 Map Join 的適用場景:非等值連線
阿新 • • 發佈:2019-02-05
一、需求分析
1: 有一個極小的表<1000行
2: 需要做不等值join操作(a.x < b.y 或者 a.x like b.y等)
這種操作如果直接使用join的話語法不支援不等於操作,hive語法解析會直接丟擲錯誤
如果把不等於寫到where裡會造成笛卡爾積,資料異常增大,速度會很慢。甚至會任務無法跑成功~
二、mapjoin的計算原理
MAPJION會把小表全部讀入記憶體中,在map階段直接拿另外一個表的資料和記憶體中表資料做匹配。這種情況下即使笛卡爾積也不會對任務執行速度造成太大的效率影響。
而且hive的where條件本身就是在map階段進行的操作,所以在where裡寫入不等值比對的話,也不會造成額外負擔。如此看來,使用MAPJOIN開發的程式僅僅使用map一個過程就可以完成不等值join操作,效率還會有很大的提升。
三、舉個例子
drop table student;
create table student (
name string
);
drop table school;;
create table school (
name string
);
insert into school values ("dddd");
insert into student values ("dddd-xxxxx");
select /*+ MAPJOIN(a) */
a.name, b.name
from school a
join (select * from student) b
where instr(b.name, a.name) > 0;