viernes, 23 de mayo de 2014

Laboratorio - Probando Pig

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:
$ pig -x local
Cargamos datos de este archivo en Pig:
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