gpt4 book ai didi

join - 无法在Hive 0.12中使用存储桶映射联接

转载 作者:行者123 更新时间:2023-12-02 20:06:24 29 4
gpt4 key购买 nike

我正在尝试一些配置单元优化功能,并遇到了以下问题:
我无法在配置单元0.12中使用存储桶映射联接。经过我在下面尝试的所有设置之后,仅生成一个哈希表文件,并且联接结果仅为 map join

我有两个以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;

该查询仅生成1个osm哈希表,然后回退到map join,我对此感到非常困惑。我是否已设置所有提示以启用存储桶映射连接功能,或者查询中是否存在任何问题?

最佳答案

缩写:
设置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并将其转换为MapJoin。此阶段没有其他的BucketMapJoin优化规则。这就是为什么我在问题中只得到Mapjoin的原因。
  • 关于join - 无法在Hive 0.12中使用存储桶映射联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22614794/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com