Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Join 无法在配置单元0.12中使用桶映射联接_Join_Hadoop_Hive - Fatal编程技术网

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

Join 无法在配置单元0.12中使用桶映射联接,join,hadoop,hive,Join,Hadoop,Hive,我在尝试一些配置单元优化功能时遇到了这样的问题: 我无法在配置单元0.12中使用桶映射联接。在我尝试了下面的所有设置之后,只生成了一个hashtable文件,连接结果只是映射连接 我有两个表格,都是rcfile格式,都被压缩成10个bucket,它们的创建和填充如下(原始数据由TPC-H生成): 我可以正常查询两个表的数据,lsm是790MB,osm是11MB,都是10个bucket文件,然后我想试试bucket map join: hive> set hive.auto.convert

我在尝试一些配置单元优化功能时遇到了这样的问题: 我无法在配置单元0.12中使用桶映射联接。在我尝试了下面的所有设置之后,只生成了一个hashtable文件,连接结果只是映射连接


我有两个表格,都是rcfile格式,都被压缩成10个bucket,它们的创建和填充如下(原始数据由TPC-H生成):

我可以正常查询两个表的数据,lsm是790MB,osm是11MB,都是10个bucket文件,然后我想试试bucket map join:

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的一个哈希表,并返回到一个映射联接,我对此感到非常困惑。我是否设置了所有提示以启用bucket map连接功能,或者我的查询中是否存在任何问题

短版:

Set
hive>Set-hive.ignore.mapjoin.hint=false
将使Bucket Map联接按预期工作。这意味着我将把10个小表的bucket文件构建为哈希表,并与相应的大文件的bucket进行哈希连接

较长的版本:

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

  • 逻辑优化

    在逻辑优化中,mapjoin优化之后是bucketmapjoin优化,bucketmapjoin优化将mapjoin操作符树作为输入,并将其转换为bucketmapjoin,因此提示查询首先转换为mapjoin,然后再转换为bucketmapjoin。因此,禁用提示的逻辑优化不会在连接树上执行连接优化

  • 物理优化

    在物理优化中,测试了
    hive.auto.convert.join
    ,并使用了
    MapJoinResolver
    将reduce join转换为MapJoin。在此阶段没有进一步的BucketMapJoin优化规则。这就是为什么我的问题中有Mapjoin


/*+Mapjoin(osm)*/是一个查询提示,指示配置单元使用osm作为哈希表进行映射联接。自Hive11以来,不需要这些提示。把它拿走,看看会发生什么。鉴于osm只有11MB,对于这些数据,mapjoin可能比bucket join快。@CarterShanklin,谢谢您的回复。我试图不给MAPJOIN提示,仍然只是生成了一个hashtable文件。我知道在我的情况下,11M的表足够小,只需要使用map join,我只想尝试bucket map join out,遗憾的是,它似乎不起作用。。。您以前使用过bucket map join吗?您的配置是什么?
hive> select /*+ Mapjoin(osm) */ osm.o_orderkey, lsm.* from osm join lsm on osm.o_orderkey = lsm.l_orderkey;