Join 无法在配置单元0.12中使用桶映射联接
我在尝试一些配置单元优化功能时遇到了这样的问题: 我无法在配置单元0.12中使用桶映射联接。在我尝试了下面的所有设置之后,只生成了一个hashtable文件,连接结果只是映射连接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
我有两个表格,都是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;