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)}) 

Ora, da qui voglio il seguente output:Pig query ORDER BY

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

Bascially, voglio ordinare i numeri: 10,9,16 e selezionare la parte superiore 2 per ogni riga .
Come faccio?

risposta

9

Questo è simile a questo question e si potrebbe utilizzare un Nested FOREACH, ad es .:

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

È anche possibile utilizzare la funzione TOP() invece che l'ordine e LIMIT. È nel porcellino salvadanaio per Pig <0.8 e buildin in> = 0.8 – NerdyNick

+0

Ho un problema simile. Sto usando TOP() ma in TOP (2) se l'input è {10,5,5,1,2} , mi aspetto che il mio output sia {10,5,5} ma il suo {10,5} in realtà Come posso risolvere questo? – sudheer

+1

Non dovrebbe l'ordinamento per DESC? Perché i primi 2 sono richiesti? –