2011-03-07 23 views
8

Tengo un conjunto de registros que estoy cargando desde un archivo y lo primero que tengo que hacer es obtener el máximo y el mínimo de una columna. En SQL Me gustaría hacer esto con una subconsulta como esto:Max/Min para conjuntos completos de registros en PIG

select c.state, c.population, 
(select max(c.population) from state_info c) as max_pop, 
(select min(c.population) from state_info c) as min_pop 
from state_info c 

que asumen que debe haber una manera fácil de hacer esto en PIG así pero estoy teniendo problemas para encontrarlo. Tiene una función MAX y MIN pero cuando he intentado hacer lo siguiente no funcionó:

records=LOAD '/Users/Winter/School/st_incm.txt' AS (state:chararray, population:int); 
with_max = FOREACH records GENERATE state, population, MAX(population); 

Esto no funcionó. Tengo más suerte al agregar una columna adicional con el mismo valor a cada fila y luego agrupándolas en esa columna. Luego sacando el máximo de ese nuevo grupo. Esto parece una forma complicada de obtener lo que quiero, así que pensé en preguntar si alguien sabe de una manera más simple.

Gracias de antemano por la ayuda.

Respuesta

15

Como dijo, debe agrupar todos los datos, pero no se necesita ninguna columna adicional si usa GROUP ALL.

cerdo

records = LOAD 'states.txt' AS (state:chararray, population:int); 
records_group = GROUP records ALL; 
with_max = FOREACH records_group 
      GENERATE 
       FLATTEN(records.(state, population)), MAX(records.population); 

entrada

CA 10 
VA 5 
WI 2 

salida

(CA,10,10) 
(VA,5,10) 
(WI,2,10) 
+0

Gracias - Yo sabía que tenía que ser una forma sencilla de hacerlo. – Winter

Cuestiones relacionadas