2014-05-20 92 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;