Как получить массив/пакет элементов из группы Hive оператором?

Я хочу сгруппировать по заданному полю и получить результат с сгруппированными полями. Ниже приведен пример того, чего я пытаюсь достичь: -

Представьте таблицу с именем "sample_table" с двумя столбцами, как показано ниже: -

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

Я хочу написать Hive Query, который даст следующий результат: -

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

В Pig это может быть очень легко достигнуто примерно следующим образом: -

grouped_relation = GROUP sample_table BY F1;

Может кто-нибудь предложить, если есть простой способ сделать это в Улье? Я могу думать о том, чтобы написать функцию, определяемую пользователем (UDF), но это может быть очень трудоемким вариантом.

Ответ 1

Встроенная функция агрегата collect_set (doumented here) позволяет получить почти то, что вы хотите. Это действительно будет работать на вашем примере ввода:

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

К сожалению, он также удаляет повторяющиеся элементы, и я думаю, что это не ваше желаемое поведение. Мне показалось странным, что collect_set существует, но нет версии для сохранения дубликатов. Кто-то, похоже, думал то же самое. Похоже, что верхний и второй ответ там даст вам UDAF.

Ответ 2

collect_set действительно работает так, как ожидалось, поскольку набор в соответствии с определением представляет собой набор четко определенных и отдельных объектов, то есть объекты происходят ровно один раз или вообще не в пределах набора.