2013-03-06 84 views
9

如果一個人有這樣的數據:自豬交叉聯接被忽略

A = LOAD 'data' AS (a1:int,a2:int,a3:int); 

DUMP A; 
(1,2,3) 
(4,2,1) 

然後一個交叉聯接被做在A上,A:

B = CROSS A, A; 

DUMP B; 
(1,2,3) 
(4,2,1) 

爲什麼是第二一個優化從查詢中取出?

信息:豬版0.11

== == UPDATE

如果我排序,如:

C = ORDER A BY a1; 
D = CROSS A, C; 

它會給一個正確的交叉聯接。

回答

10

我認爲你必須加載數據兩次才能達到你想要的。

A1 = LOAD 'data' AS (a1:int,a2:int,a3:int); 
A2 = LOAD 'data' AS (a1:int,a2:int,a3:int); 
B = CROSS A1, A2; 
+0

是因爲框架的數據流性質嗎? – 2013-03-06 20:00:02

+0

這是因爲背景中產生的map-reduce作業的類型:但是您執行連接時,需要兩個單獨的輸入。 – davek 2013-03-06 20:10:07

14

davek是正確的 - 你不能CROSS(或JOIN)與自身的關係。如果你想這樣做,你必須創建一個數據的副本。在這種情況下,您可以使用另一個LOAD聲明。如果你想通過管道進一步處理關係,你需要使用FOREACH來複制它。

我有幾個宏,我經常使用和IMPORT默認情況下在我所有的豬腳本,以防我需要它們。一個用於僅此目的:

DEFINE DUPLICATE(in) RETURNS out 
{ 
     $out = FOREACH $in GENERATE *; 
}; 

這會爲你工作的地方在您的管道,你需要重複:

A1 = LOAD 'data' AS (a1:int,a2:int,a3:int); 
A2 = DUPLICATE(A1); 
B = CROSS A1, A2; 

注意,即使A1A2是相同的,你不能假設記錄的順序相同。但是如果你正在做CROSSJOIN,這可能沒有關係。