如何通过运营商从Hive组获取数组/包元素?

Anu*_*oop 16 sql hadoop hive apache-pig bigdata

我想按给定字段进行分组,并使用分组字段获取输出.以下是我想要实现的一个例子: -

想象一下名为'sample_table'的表,其中有两列如下: -

F1  F2
001 111
001 222
001 123
002 222
002 333
003 555
Run Code Online (Sandbox Code Playgroud)

我想编写Hive Query,它将提供以下输出: -

001 [111, 222, 123]
002 [222, 333]
003 [555]
Run Code Online (Sandbox Code Playgroud)

在猪中,这可以通过以下方式轻松实现: -

grouped_relation = GROUP sample_table BY F1;
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*man 25

内置的聚合函数collect_set(在这里添加)几乎可以获得你想要的东西.它实际上适用于您的示例输入:

SELECT F1, collect_set(F2)
FROM sample_table
GROUP BY F1
Run Code Online (Sandbox Code Playgroud)

不幸的是,它也删除了重复的元素,我想这不是你想要的行为.我发现它collect_set存在奇怪,但没有版本可以保留重复.其他人显然也想到了同样的事情.看起来顶部和第二个答案将为您提供所需的UDAF.

  • 在Hive 0.13中有一个`collect_list`函数,它将返回重复项. (12认同)