OIN列同时也是BUCKET列,JOIN语句如下:
SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a JOIN b ON a.key = b.key;
JOIN的过程是,表a的BUCKET 1只会与表b中的BUCKET 1进行JOIN,而不再考虑表b中的其他BUCKET 2~36。
如果上述表具有相同的BUCKET,如都是36个,而且还是排序的,即,在表定义中在CLUSTERED BY(key)后面增加如下约束:
SORTED BY(key)
则上述JOIN语句会执行一个Sort-Merge-Bucket (SMB) JOIN,同样需要设置如下参数来改变默认行为,优化JOIN时只遍历相关的BUCKET即可:
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
上面三个参数默认值为:
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
hive.optimize.bucketmapjoin=false
hive.optimize.bucketmapjoin.sortedmerge=false;
10) MapJoin Restrictions
SELECT/*+ MAPJOIN(b) */ a.key, a.value
FROMa JOIN b ON a.key = b.key;
不需要reducer,对于表A的每个mapper,可以完全读取表B。
下面列出的都是MapJoin不支持的:
?UnionFollowed by a MapJoin
?LateralView Followed by a MapJoin
?ReduceSink (Group By/Join/Sort By/Cluster By/Distribute By) Followed by MapJoin
?MapJoinFollowed by Union
?MapJoinFollowed by Join
?MapJoinFollowed by MapJoin
配置参数hive.auto.convert.join=true,如果可能的话,自动将joins转换为mapjoins,它应该取代使用mapjoinhint。
下面的查询应该使用mapjoinhint:
如果所有的inputs都被bucketed或者sorted,并且join应该被转换为bucketizedmap-size join或者bucketized-mergejoin。