最近开发中遇到几种应用,恰好使用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使用经验