2013-03-06 14 views
9

Se si dispongono di dati come quelli:Auto cross-unirsi maiale viene ignorata

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

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

E poi un cross-join è fatto su una, A:

B = CROSS A, A; 

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

Perché secondo A ottimizzata fuori dalla query?

informazioni: versione 0.11 del maiale

== AGGIORNAMENTO ==

Se ordina un simile:

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

darà un corretto cross-join.

risposta

10

Penso che sia necessario caricare i dati due volte per ottenere ciò che si desidera.

cioè

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

È a causa della natura del flusso di dati del framework? –

+0

È a causa del tipo di lavori di riduzione della mappa che vengono generati in background: tuttavia, se si esegue il join, saranno necessari due input separati. – davek

14

DaveK è corretta - non si può CROSS (o JOIN) una relazione con se stesso. Se desideri farlo, devi creare una copia dei dati. In questo caso, è possibile utilizzare un'altra istruzione LOAD. Se vuoi farlo con una relazione più avanti lungo una pipeline, dovrai duplicarla usando FOREACH.

Ho diversi macro che uso frequentemente e IMPORT di default in tutti i miei script Pig nel caso in cui ne abbia bisogno. Uno è utilizzato proprio per questo scopo:

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

Questo funziona per voi, ovunque nel pipeline hai bisogno di un duplicato:

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

Nota che, anche se A1 e A2 sono identici, non si può presumere che i record sono nello stesso ordine. Ma se stai facendo un CROSS o JOIN, questo probabilmente non importa.

Problemi correlati