整理两年前草稿
MapJoin在使用合理的情况下性能优于普通Join,可以通过显式的优化器提示让执行计划采用mapjoin,这在大部分hive的优化文章中都有介绍,这里想说的是可以通过配置hive的参数,在join中存在小表时优化器自动采用mapjoin完成连接操作,设置参数如下:
hive.auto.convert.join = true
hive.smalltable.filesize = 30000000
参数分别表示启用自动转化与小表的文件大小,执行计划会同时生成两种join的计划,在实际执行时根据表的大小决定采取哪种join方式,当实际内存不够大,mapjoin挂掉时,hive会自动重启普通join。
在使用reduceJoin时,把小表放在前面是有好处的,reduce会试图将前表放入内存建立Hash结构(类似Oracle join两大表的情况,这时的连接策略一般就是hash)