2013-05-08 8 views
11

Voglio raggruppare per un dato campo e ottenere l'output con i campi raggruppati. Di seguito è riportato un esempio di quello che sto cercando di realizzare: -Come ottenere array/bag di elementi dal gruppo Hive per operatore?

immaginare una tabella denominata 'sample_table' con due colonne, come di seguito: -

F1 F2 
001 111 
001 222 
001 123 
002 222 
002 333 
003 555 

voglio scrivere Hive query che darà l'uscita in basso : -

001 [111, 222, 123] 
002 [222, 333] 
003 [555] 

In Pig, questo può essere raggiunto facilmente da qualcosa di simile: -

grouped_relation = GROUP sample_table BY F1; 

Qualcuno può suggerire se esiste un modo semplice per farlo in Hive? Quello che posso pensare è scrivere una User Defined Function (UDF) per questo, ma questa può essere un'opzione che richiede molto tempo.

risposta

20

La funzione aggregata incorporata collect_set (doumented here) ti fa quasi quello che vuoi. Si sarebbe in realtà lavorare al vostro ingresso esempio:

SELECT F1, collect_set(F2) 
FROM sample_table 
GROUP BY F1 

Purtroppo, rimuove anche gli elementi duplicati e immagino questo non è il comportamento desiderato. Trovo strano che esista collect_set, ma nessuna versione per conservare i duplicati. Someone else apparently thought the same thing. Sembra che la prima e la seconda risposta vi forniranno l'UDAF di cui avete bisogno.

+9

In Hive 0.13 esiste una funzione 'collect_list' che restituisce i duplicati. –

0

collect_set funziona effettivamente come previsto poiché un set come per definizione è un insieme ben definito e distinti oggetti, ad esempio gli oggetti si verificano esattamente una volta o non si trovano affatto all'interno di un set.

Problemi correlati