2012-06-08 4 views
7

Tengo un PIG Script que produce cuatro resultados Quiero almacenarlos todos en un solo archivo. Intento utilizar UNION, sin embargo cuando uso UNION obtengo cuatro archivos part-m-00000, part-m-00001, part-m-00002, part-m-00003. ¿Puedo obtener un solo archivo?Almacenamiento de resultados de UNION en CERDO en un solo archivo

Aquí es el guión PIG

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

Dentro de la carpeta AA recibo 4 archivos como se mencionó anteriormente. ¿No puedo obtener un solo archivo con todas las entradas?

Respuesta

12

Pig está haciendo lo correcto aquí y está uniendo los conjuntos de datos. Si todo es un archivo, no significa que haya un conjunto de datos en Hadoop ... un conjunto de datos en Hadoop suele ser una carpeta. Como no necesita ejecutar una reducción aquí, no lo hará.

Tienes que engañar a Pig para ejecutar un mapa Y reducir. La forma en que suelo hacer esto es:

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); 
... 

Los GROUP BY grupos de todos los registros juntos, y luego los FLATTEN explota que la lista de vuelta.


Una cosa a tener en cuenta es que esto no es muy diferente de hacerlo:

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

(esto es concatenando todo el texto, y luego escribir de nuevo a HDFS como un nuevo archivo)

Esto no es paralelo en absoluto, pero tampoco está canalizando todos sus datos a través de un reductor.

+3

También puede hacer 'GROUP ... BY 1 parallel 1' en lugar de establecer el global' default_parallel'. –

1

¿Ha intentado establecer la propiedad default_parallel?

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

No, todavía me da 4 archivos. Acabo de utilizar dicha línea, gruñido> establecer default_parallel 1 ¿Debo hacer algo más con respecto a las propiedades del cerdo? – Uno

+0

Es un trabajo de solo mapa, por lo que la configuración 'default_parallel' no funcionará, ya que solo afecta a la fase de reducción. Si esto es parte de un trabajo más grande, puede intentar escribir el script de manera que el último trabajo sea un trabajo reducido, y luego establecer 'default_parallel' en' 1' antes de ese trabajo, entonces funcionaría. –

Cuestiones relacionadas