2012-06-08 3 views
7

Ho uno script PIG che produce quattro risultati Voglio memorizzarli tutti in un unico file. Provo a utilizzare UNION, tuttavia quando uso UNION ottengo quattro file part-m-00000, part-m-00001, part-m-00002, part-m-00003. Posso ottenere un singolo file?Memorizzazione dei risultati di UNION in PIG in un singolo file

Ecco lo script PIG

A = UNION Message_1,Message_2,Message_3,Message_4 into 'AA'; 

All'interno della cartella AA ottengo 4 file di cui sopra. Non riesco a ottenere un singolo file con tutte le voci al suo interno?

risposta

12

Pig sta facendo la cosa giusta qui e sta unendo i set di dati. Tutto essendo un file non significa un set di dati in Hadoop ... un set di dati in Hadoop è solitamente una cartella. Dal momento che non ha bisogno di eseguire una riduzione qui, non lo farà.

È necessario ingannare Pig per eseguire una mappa e ridurre. Il modo in cui faccio di solito questo è:

set default_parallel 1 

... 
A = UNION Message_1,Message_2,Message_3,Message_4; 
B = GROUP A BY 1; -- group ALL of the records together 
C = FOREACH B GENERATE FLATTEN(A); 
... 

I GROUP BY gruppi tutti i record insieme, e poi le FLATTEN esplode che elencano di nuovo fuori.


Una cosa da notare qui è che questo non è molto diverso dal fare:

$ hadoop fs -cat msg1.txt msg2.txt msg3.txt msg4.txt | hadoop fs -put - union.txt 

(questo è concatenando tutto il testo, e poi scrivere di nuovo fuori a HDFS come nuovo file)

Questo non è affatto parallelo, ma nessuno dei due sta canalizzando tutti i dati attraverso un riduttore.

+3

Puoi anche fare il 'GROUP ... BY 1 parallel 1' invece di impostare il' default_parallel 'globale. –

1

Hai provato a impostare la proprietà default_parallel?

grunt> set default_parallel 1 
grunt> A = UNION Message_1,Message_2,Message_3,Message_4; 
+0

No mi dà ancora 4 file. Ho appena usato la linea indicata, grunt> set default_parallel 1 Dovrei fare qualcosa di più per quanto riguarda le proprietà del maiale? – Uno

+0

Si tratta di un lavoro solo per la mappa, quindi l'impostazione di default_parallel non funzionerà poiché influisce solo sulla fase di riduzione. Se questo fa parte di un lavoro più grande, puoi provare a scrivere lo script in modo che l'ultimo lavoro sia un lavoro ridotto, quindi impostare 'default_parallel' su' 1' prima di quel lavoro, quindi funzionerebbe. –

Problemi correlati