Para una primera toma de contacto con Pig seguí un pequeño ejemplo que se encuentra en el libro 'Hadoop: The Definitive Guide, 3rd Edition'.
Contenido de archivo 'sample.txt': datos
extraídos de sensores de temperatura, donde registro de temperatura
+9999 indica una lectura errónea y el código de calidad debe ser 1, 4, 5
o 9 para considerar una medida fiable. Queremos obtener la temperatura máxima que hizo en cada uno de los años.
1950 0 1
1950 22 4
1950 -11 1
1950 9999 1
1950 22 4
1950 -11 3
1949 111 1
1949 78 1
1949 9999 4
1949 78 1
Corriendo Pig desde el Shell Grunt
Iniciamos Pig en local desde el terminal:Cargamos datos de este archivo en Pig:$ pig -x local
grunt> registros = LOAD 'sample.txt' AS (anyo:chararray, temperatura:int, calidad:int);Mostramos las tuplas almacenadas en la relación registros:
grunt> DUMP registros;Filtramos los registros:grunt> registros_filtrados = FILTER registros BY (temperatura != 9999) and (calidad==1 or calidad==4 or calidad==5 or calidad==9);Agrupamos los registros por año:
grunt> registros_agrupados = GROUP registros_filtrados BY anyo;Se crean tuplas que están compuestas por cada uno de los años y una 'bag' (colección desordenada de tuplas). Cada tupla corresponde a un año. Para cada una de ellas generamos una nueva relación que contiene el año de la tupla y la máxima temperatura de la bag:
temp_max = FOREACH registros_agrupados GENERATE group AS anyo, MAX(registros_filtrados.temperatura) AS temperatura;Observamos el resultado:
grunt> DUMP temp_max;(1949,111)
(1950,22)
Podemos observar el esquema de cada relación con el comando Describe:
grunt> DESCRIBE registros;
registros: {anyo: chararray,temperatura: int,calidad: int}
grunt> DESCRIBE registros_filtrados;
registros_filtrados: {anyo: chararray,temperatura: int,calidad: int}
grunt> DESCRIBE registros_agrupados;
registros_agrupados: {group: chararray,registros_filtrados: {(anyo: chararray,temperatura: int,calidad: int)}}
Ejecutando un script en Pig
Almacenamos los comandos anteriores en un archivo 'max_temp.pig':
--- Busca la máxima temperatura por años
registros = LOAD 'sample.txt' AS (anyo:chararray, temperatura:int, calidad:int);
registros_filtrados = FILTER registros BY (temperatura != 9999) and (calidad==1 or calidad==4 or calidad==5 or calidad==9);
registros_agrupados = GROUP registros_filtrados BY anyo;
temp_max = FOREACH registros_agrupados GENERATE group AS anyo, MAX(registros_filtrados.temperatura) AS temperatura;
dump temp_max;
Desde el terminal podemos correr el script:
$ pig -x local max_temp.pig
No hay comentarios:
Publicar un comentario