无法在配置单元0.12中使用桶映射连接

时间:2014-03-24 16:14:00

标签: join hadoop hive

我正在尝试一些hive优化功能并遇到了这样的问题: 我不能在hive 0.12中使用桶映射连接。完成我在下面尝试的所有设置后,只会生成一个哈希表文件,而加入结果只是地图加入


我有两个rcfile格式的表,并且都被推送到10个桶中,它们的创建和填充如下(原始数据是从TPC-H生成的):

hive> create table lsm (l_orderkey int, l_partkey int, l_suppkey int, l_linenumber int, l_quantity double, l_extendedprice double, l_discount double, l_tax double, l_returnflag string, l_linestatus string, l_shipdate string, l_commitdate string, l_receiptdate string, l_shipstruct string, l_shipmode string, l_comment string) clustered by (l_orderkey) into 10 buckets stored as rcfile;
hive> create table osm (o_orderkey int, o_custkey int) clustered by (o_orderkey) into 10 buckets stored as rcfile;
hive> set hive.enforce.bucketing=true;
hive> insert overwrite table lsm select * from orili;
hive> insert overwrite table osm select o_orderkey, o_custkey from orior;

我可以正常查询两个表的数据,lsm是790MB,osm是11MB,都是10个桶文件,然后我想尝试桶映射连接:

hive> set hive.auto.convert.join=true; 
hive> set hive.optimize.bucketmapjoin=true;
hive> set hive.enforce.bucketmapjoin=true;
hive> set hive.auto.convert.join.noconditionaltask=true;
hive> set hive.auto.convert.join.noconditionaltask.size=1000000000000000;
hive> set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;

我的查询如下:

hive> select /*+ Mapjoin(osm) */ osm.o_orderkey, lsm.* from osm join lsm on osm.o_orderkey = lsm.l_orderkey;

这个查询只生成一个osm的哈希表并回退到一个地图连接,我真的很困惑。我是否已将所有提示设置为启用存储桶映射连接功能,或者我的查询中是否存在任何问题?

1 个答案:

答案 0 :(得分:1)

简短版本:

设置hive> set hive.ignore.mapjoin.hint=false; 将使Bucket Map Join按预期工作。这意味着我会将10个小表的存储桶文件构建为哈希表,并使用相应的大文件桶进行哈希连接。

更长的版本:

我深入了解hive 0.12代码并在hive.ignore.mapjoin.hint中找到HiveConf.java,默认设置为true,这意味着故意忽略/*+ MAPJOIN */提示。由于配置单元中存在两个优化阶段,逻辑优化物理优化,因此两者都是基于规则的优化。

  • 逻辑优化

    在逻辑优化中,mapjoin优化之后是bucketmapjoin优化,bucketmapjoin优化将MapJoin运算符树作为输入并将其转换为BucketMapJoin,因此提示查询将是首先转换为mapjoin然后转换为bucketmapjoin。因此,提示禁用逻辑优化将不会在连接树上进行任何连接优化。

  • 物理优化

    在物理优化中,hive.auto.convert.join已经过测试,并且使用了MapJoinResolver,只是将reduce连接转换为MapJoin。此阶段没有进一步的BucketMapJoin优化规则。这就是我在问题中获得Mapjoin的原因。