25

我想按给定字段分组并获得分组字段的输出。下面是我想要实现的一个例子: -

想象一个名为“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;

有人可以建议在 Hive 中是否有一种简单的方法可以做到这一点?我能想到的是为此编写一个用户定义函数(UDF),但这可能是一个非常耗时的选项。

4

2 回答 2

34

内置的聚合函数collect_setdoumented here)几乎可以满足您的需求。它实际上适用于您的示例输入:

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

不幸的是,它还删除了重复的元素,我想这不是您想要的行为。我觉得它的collect_set存在很奇怪,但没有保留重复的版本。其他人显然也有同样的想法。看起来第一和第二个答案将为您提供所需的 UDAF。

于 2013-05-08T19:23:45.880 回答
0

collect_set 实际上按预期工作,因为根据定义的集合是定义明确且不同的对象的集合,即对象在集合中仅出现一次或根本不出现。

于 2017-03-15T17:29:11.100 回答