最近开发中遇到几种应用,刚好使用MAPJOIN来解决实际的问题。
应用共同点如下:
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操作,效率还会有很大的提升。
问题解决~~
示例代码如下:
1 | 1: select /*+ MAPJOIN(a) */ |
2 | 2: a.start_level, b.* |
3 | 3: from dim_level a |
4 | 4: join ( select * from test) b |
5 | 5: where b.xx>=a.start_level and b.xx<end_level; |
推荐阅读:
Hive 随谈(四)– Hive QL
http://www.alidata.org/archives/581
hive使用经验
http://www.docin.com/p-150084947.html
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。