2014-05-20 91 views
0

我在执行bucketed map join时遇到问题。Hive Bucketed Map加入

我正在使用配置单元0.10

表1是年,月,日的分区表。每个分区数据由列c1分成128个存储桶。我每天有近1亿条记录。

Table 1 
create table1 
(
.... 
.... 
) 
partitioned by (year int,month int,day int) 
CLUSTERED BY(c1) INTO 128 BUCKETS; 

表2是分时段上柱C1的大型查找表。我有8000万条记录加载到128个桶中。

Table 2 
create table2 
(
c1 
c2 
... 
) 
CLUSTERED BY(c1) INTO 128 BUCKETS; 

我检查了数据,它按照期望加载到桶中。

现在,我试图强制bucketed地图加入。这就是我卡住的地方。

set hive.auto.convert.join=true; 
set hive.optimize.bucketmapjoin = true; 
set hive.mapjoin.bucket.cache.size=1000000; 

select a.c1 as c1_tb2,a.c2 
     b.c1,b.... 
from table2 a 
JOIN table1 b 
ON (a.c1=b.c1); 

我还没有得到bucketed地图连接。我错过了什么吗?即使我试图只在一个分区上执行连接。但是,我仍然得到相同的结果。

Bucketed map join不起作用分区表?

请帮忙。谢谢。

+0

你有没有设置'hive.enforce.bucketing = TRUE'前加载数据?另外,由于桶的数量是相同的,我认为你最好使用'sort-merge'加入。 – visakh

+0

我已经设置了hive.enforce.bucketing = true参数。我尝试使用排序合并连接。但是,我不知道如何知道排序合并连接是否正在发生? – jigarshah

+0

以确保在查询中使用explain命令尝试进行操作 – fd8s0

回答

1

此解释适用于Hive 0.13。 AFAICT,bucketed地图连接不会对自动转换的地图连接生效。您将需要显式调用了地图中的语法加入这样的:

set hive.optimize.bucketmapjoin = true;             
explain extended select /* +MAPJOIN(b) */ count(*) 
from nation_b1 a 
join nation_b2 b on (a.n_regionkey = b.n_regionkey); 

注意,只能解释扩展显示你表示如果联接正在使用或不斗地图的标志。在计划中寻找这条线。

BucketMapJoin: true 
0

表配置单元用于单独管理/处理部分数据。这将使该流程在性能方面易于管理和高效。 让我们了解数据存储在桶中时的连接:

假设有两个表user和user_visits,并且两个表数据都使用4个桶中的user_id进行分区。这意味着用户的存储桶1将包含具有与user_visits的存储桶1相同的用户ID的行。如果在user_id列上的这两个表上执行联接,如果可以将两个表的bucket 1发送给相同的映射器,则可以实现大量的优化。这恰好在bucketed map join中完成。

先决条件桶地图加入:

表接合是在连接列bucketized, 在一个表中桶的数量是在其他表桶的数量的相同/多。 可以将桶彼此连接,如果连接的表在连接柱上是bucketized的。如果表A有4桶和表B有4桶,下面的加盟

SELECT /*+ MAPJOIN(b) */ a.key, a.valueFROM a JOIN b ON a.key = b.key 

可以映射器才能这样做。不是为每个A的映射器完全获取B,而只是获取所需的存储桶。对于上面的查询中,A中的映射器处理桶1将只取B的桶1这不是默认行为,并且由下面的参数

set hive.optimize.bucketmapjoin = true 

管辖如果被连接的表被分类和bucketized在连接列上,并且它们具有相同数量的存储桶,则可以执行排序合并连接。相应的桶在映射器上彼此连接。如果A和B都有4个桶,那么

SELECT /*+ MAPJOIN(b) */ a.key, a.valueFROM A a JOIN B b ON a.key = b.key 

只能在映射器上完成。铲斗对于A映射器会遍历相应的桶B.这是不是默认的行为,和下面的参数需要进行设置:

set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat; 
set hive.optimize.bucketmapjoin = true; 
set hive.optimize.bucketmapjoin.sortedmerge = true;