it-swarm.com.de

Wie erhalte ich ein Array/einen Beutel mit Elementen von der Hive-Gruppe nach Operator?

Ich möchte nach einem bestimmten Feld gruppieren und die Ausgabe mit gruppierten Feldern erhalten. Nachfolgend finden Sie ein Beispiel für das, was ich erreichen möchte:

Stellen Sie sich eine Tabelle mit dem Namen 'sample_table' mit zwei Spalten wie folgt vor:

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

Ich möchte eine Hive-Abfrage schreiben, die die folgende Ausgabe liefert:

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

In Pig kann dies sehr einfach durch Folgendes erreicht werden:

grouped_relation = GROUP sample_table BY F1;

Kann jemand bitte vorschlagen, ob es einen einfachen Weg gibt, dies in Hive zu tun? Ich kann mir vorstellen, eine benutzerdefinierte Funktion (User Defined Function, UDF) dafür zu schreiben, aber dies kann eine sehr zeitaufwendige Option sein.

12
Anuroop

Mit der integrierten Aggregatfunktion collect_set ( hier dokumentiert ) erhalten Sie fast das, was Sie wollen. Es würde tatsächlich auf Ihrer Beispieleingabe funktionieren:

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

Leider werden auch doppelte Elemente entfernt, und ich stelle mir vor, dass dies nicht Ihr gewünschtes Verhalten ist. Ich finde es seltsam, dass collect_set existiert, aber keine Version, um Duplikate zu führen. Jemand anderes hat anscheinend dasselbe gedacht . Es sieht so aus, als ob die erste und zweite Antwort dort den UDAF ergibt, den Sie benötigen.

22
Daniel Koverman

collect_set funktioniert tatsächlich wie erwartet, da eine Menge gemäß Definition eine Sammlung gut definierter und unterschiedlicher Objekte ist, d. h. Objekte treten genau einmal oder überhaupt nicht in einer Menge auf.

0
ellaqezi