2012-02-03 13 views
5
grunt> dump jn; 

(k1,k4,10) 
(k1,k5,15) 
(k2,k4,9) 
(k3,k4,16) 

grunt> jn = group jn by $1; 
grunt> dump jn; 


(k4,{(k1,k4,10),(k2,k4,9),(k3,k4,16)}) 
(k5,{(k1,k5,15)}) 

Ahora, de aquí Quiero el siguiente resultado:cerdo Ordenar Por consultas

(k4,{(k3,k4,16),(k1,k4,10)}) 
(k5,{(k1,k5,15)}) 

Bascially, que desee ordenar los números: 10,9,16 y seleccione la parte superior 2 para cada fila .
¿Cómo lo hago?

Respuesta

9

Esto es similar a este question y se podía utilizar un Nested FOREACH, por ejemplo .:

A = LOAD 'data'; 
jn = group A by $1; 
B = FOREACH jn { 
    sorted = ORDER A by $2 ASC; 
    lim = LIMIT sorted 2; 
    GENERATE lim; 
}; 
DUMP B; 
+2

También se puede simplemente utilizar la función TOP() en lugar de la orden y LIMIT. Está en piggybank para Pig <0.8 y buildin in> = 0.8 – NerdyNick

+0

Tengo un problema similar. Estoy usando TOP() pero en TOP (2) si la entrada es {10,5,5,1,2} Espero que mi salida sea {10,5,5} pero es {10,5} en realidad ¿Cómo podría resolver esto? – sudheer

+1

¿No debería el orden de clasificación de DESC? Porque los 2 primeros se solicitan? –