2011-03-17 10 views
5

Estoy tratando de analizar los archivos de datos separados por tabulaciones generados por nuestros servicios usando Elastic Map Reduce de Amazon a través de un programa Pig. Las cosas van bien, excepto que todos nuestros archivos de datos contienen una fila de encabezado que define el propósito de cada columna. Obviamente, las cabeceras (cuerda) no pueden ser arrojados a valores de datos numéricos, por lo que reciben advertencias de cerdo como la siguiente:¿Cómo recorto una fila de encabezado de los archivos procesados ​​por Hadoop's Pig?

2011-03-17 22:49:55,378 [main] WARN org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigHadoopLogger - org.apache.pig.builtin.PigStorage: Unable to interpret value [<snip>] in field being converted to double, caught NumberFormatException <For input string: "headerName"> field discarded 

Tengo un filtro después de la declaración de carga que intenta que yo no opere más tarde en ninguna línea de encabezado (filtrando los términos del encabezado), pero me gustaría deshacerme del ruido de advertencia para evitar enmascarar cualquier posible problema (como los campos de datos reales que no se emiten correctamente).

¿Esto es posible?

Respuesta

0

Puede hacerlo antes de enviar trabajos Pig (si es posible), o intente escribir UDF que emitiría valores nulos si se cumplen ciertas condiciones, por lo que más adelante podría filtrar esto.

3

Otra opción, si usted no se siente cómodo con la escritura de una UDF, podría ser algo como esto:

datos de la muestra:

MyIntVal 
123 
456 

Guión:

A = load 's3://blah/myFile' USING PigStorage() as (myintval: chararray); 

B = filter A by myintval neq 'MyIntVal'; 

C = foreach B generate (int)$0; 

Esto filtra la fila del encabezado afuera, luego envía los valores restantes a int.

No dice que esta es la mejor manera de hacerlo, pero es otra opción que es bastante simple si se ajusta a su situación.

0

Esto puede ayudar a obtener su resultado: -

input_file = load 'input' using PigStorage(',') as (row1:chararay, row2:chararray); 
ranked = rank input_file; 
/* ranked:{rank_input_file:long, row1:chararay, row2:chararay} */ 
NoHeader = filter ranked by (rank_input_file > 1); 
New_input_file = foreach NoHeader generate row1, row2; 
Cuestiones relacionadas