2014-04-20 10 views
8

Diciamo che JOIN due relazioni come:Come rimuovere le colonne duplicate dopo un JOIN in Pig?

-- part looks like: 
-- 1,5.3 
-- 2,4.9 
-- 3,4.9 

-- original looks like: 
-- 1,Anju,3.6,IT,A,1.6,0.3 
-- 2,Remya,3.3,EEE,B,1.6,0.3 
-- 3,akhila,3.3,IT,C,1.3,0.3 

jnd = JOIN part BY $0, original BY $0; 

l'uscita sarà:

1,5.3,1,Anju,3.6,IT,A,1.6,0.3 
2,4.9,2,Remya,3.3,EEE,B,1.6,0.3 
3,4.9,3,akhila,3.3,IT,C,1.3,0.3 

noti che $0 viene mostrato due volte in ogni tupla. EG:

1,5.3,1,Anju,3.6,IT,A,1.6,0.3 
^ ^
|-----| 

posso rimuovere la chiave duplicata manualmente facendo:

jnd = foreach jnd generate $0,$1,$3,$4 ..; 

C'è un modo per rimuovere questo in modo dinamico? Mi piace remove(the duplicate key joiner).

+2

Per quanto ne so non c'è modo di farlo al momento con Pig.Inoltre, l'unico modo diverso dalla tua attuale soluzione a cui posso pensare è 'FOREACH foo GENERATE FLATTEN (remove (TOTUPLE (*), 2));' dove '2' è la posizione della colonna da rimuovere e' remove' è un UDF. Penso che la tua soluzione sia molto migliore, tuttavia puoi abbreviare a 'FOREACH jnd GENERATE $ 0, $ 1, $ 3 ..'. – mr2ert

+0

Vorrei che ci fosse un modo per farlo più facile, ma qui c'è una bella sintassi per definire manualmente l'output del join: http://stackoverflow.com/a/17273031/542620 – Freerobots

risposta

2

Hanno affrontato lo stesso tipo di problema mentre lavoravano su Data Set Joining e altre tecniche di elaborazione dati dove in uscita i nomi delle colonne vengono ripetuti.

Così stava lavorando su UDF che rimuoverà la colonna dei duplicati utilizzando il nome schema di quel campo e conservando i primi dati di ricorrenza di colonna univoci.

pre-requisito:

Nome di tutti i campi dovrebbero essere presenti

È necessario scaricare questo file UDF e renderlo vasetto in modo da usarlo.

UDF posizione del file da GitHub: GitHub UDF Java File Location

Noi prenderemo la domanda di cui sopra come esempio.

--Data Set A contains this data 
-- 1,5.3 
-- 2,4.9 
-- 3,4.9 

--Data Set B contains this data 
-- 1,Anju,3.6,IT,A,1.6,0.3 
-- 2,Remya,3.3,EEE,B,1.6,0.3 
-- 3,Akhila,3.3,IT,C,1.3,0.3 

MAIALE Script:

REGISTER /home/user/ 
DSA = LOAD '/home/user/DSALOC' AS (ROLLNO:int,CGPA:float); 
DSB = LOAD '/home/user/DSBLOC' AS (ROLLNO:int,NAME:chararray,SUB1:float,BRANCH:chararray,GRADE:chararray,SUB2:float); 
JOINOP = JOIN DSA BY ROLLNO,DSB BY ROLLNO; 

Avremo nome di colonna dopo l'adesione come DSA :: ROLLNO: int, DSA :: CGPA: float, DSB :: ROLLNO: int, DSB :: NOME: chararray, DSB :: SUB1: galleggiante, DSB :: RAMO: chararray, DSB :: GRADE: chararray, DSB :: SUB2: galleggiante

per rendere al DSA :: ROLLNO: int, DSA :: CGPA: float, DSB :: NOME: chararray, DSB :: SUB1: float, DSB :: BRANCH: chararray, DSB :: GRADO: chararray, DS B :: SUB2: float

DSB :: ROLLNO: int viene rimosso.

Abbiamo bisogno di usare l'UDF come

JOINOP_NODUPLICATES = FOREACH JOINOP GENERATE FLATTEN(org.imagine.REMOVEDUPLICATECOLUMNS(*)); 

Dove org.imagine.REMOVEDUPLICATECOLUMNS è l'UDF.

Questa UDF rimuove le colonne duplicate utilizzando Nome nello schema. DSa :: ROLLNO: int viene mantenuto e DSB :: ROLLNO: int viene rimosso dal set di dati.