2013-05-08 3 views
11

Ich möchte nach einem bestimmten Feld gruppieren und die Ausgabe mit gruppierten Feldern erhalten. Unten ist ein Beispiel dafür, was ich zu erreichen versuchen: -Wie bekomme ich Array/Beutel mit Elementen von Hive Group nach Operator?

eine Tabelle, wie unten ‚sample_table‘ mit zwei Spalten namens Imagine: -

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

Ich mag Hive Abfrage schreiben, die die unten Ausgabe geben werden : -

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

In Schwein, das durch so etwas wie dieses lassen sich sehr leicht erreicht: -

grouped_relation = GROUP sample_table BY F1; 

Kann jemand bitte vorschlagen, ob es eine einfache Möglichkeit gibt, dies in Hive zu tun? Was ich mir vorstellen kann, ist eine benutzerdefinierte Funktion (User Defined Function, UDF) dafür zu schreiben, aber das könnte eine sehr zeitraubende Option sein.

Antwort

20

Die integrierte Aggregatfunktion collect_set (doumented here) bekommt Sie fast, was Sie wollen. Es wäre tatsächlich auf Ihrem Beispiel Eingabe arbeiten:

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

Leider ist es entfernt auch doppelte Elemente und ich denke, dies nicht das gewünschte Verhalten. Ich finde es seltsam, dass collect_set existiert, aber keine Version, um Duplikate zu halten. Someone else apparently thought the same thing. Es sieht so aus, als ob die oberste und zweite Antwort Ihnen den UDAF geben wird, den Sie brauchen.

+9

In Hive 0.13 gibt es eine Funktion 'collect_list', die Duplikate zurückgibt. –

0

collect_set funktioniert tatsächlich wie erwartet, da ein Satz gemäß Definition eine Sammlung wohldefinierter und distinkter Objekte ist, d. H. Objekte treten genau einmal oder gar nicht innerhalb eines Satzes auf.