【问题标题】:How to get array/bag of elements from Hive group by operator?如何通过运算符从 Hive 组中获取元素的数组/包?
【发布时间】:2013-05-02 21:12:45
【问题描述】:

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

想象一个名为“sample_table”的表,其中包含如下两列:-

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

我想编写 Hive 查询,它会给出以下输出:-

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

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

grouped_relation = GROUP sample_table BY F1;

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

【问题讨论】:

    标签: sql hadoop hive apache-pig bigdata


    【解决方案1】:

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

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

    不幸的是,它还会删除重复的元素,我想这不是您想要的行为。我觉得很奇怪 collect_set 存在,但没有保留重复的版本。 Someone else apparently thought the same thing。看起来第一个和第二个答案将为您提供所需的 UDAF。

    【讨论】:

    • 在 Hive 0.13 中有一个 collect_list 函数将返回重复项。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-21
      • 2021-09-11
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多