HiveJoin(三)

2015-11-21 01:41:42 · 作者: · 浏览: 10
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。