Hive - 在组中添加包含多个不同值的列

时间:2015-10-22 10:44:56

标签: hadoop hive

假设我有以下数据。

OrderedSet

我想按number group 1 a 1 a 3 a 4 a 4 a 5 c 6 b 6 b 6 b 7 b 8 b 9 b 10 b 14 b 15 b 对数据进行分组,然后添加一个列,说明每个群组有多少group个不同的值。

我想要的输出如下:

number

我试过的是:

number  group   dist_number
1       a       3
1       a       3
3       a       3
4       a       3
4       a       3
5       c       1
6       b       9
6       b       9
6       b       9
7       b       9
8       b       9
9       b       9
10      b       9
14      b       9
15      b       9

正如人们所看到的,这会全局聚合并独立于组计算不同值的数量。

我可以做的一件事是使用> select *, count(distinct number) over(partition by group) from numbers; 11 11 ,如下所示:

group by

然后加入hive> select *, count(distinct number) from numbers group by group; a 3 b 7 c 1

但我想也许有一个更简单的解决方案,例如,使用group方法?

2 个答案:

答案 0 :(得分:1)

你肯定想在这里使用窗口函数。我不确定你是如何从你试过的查询中得到11 11的;我99%肯定如果您在Hive中count(distinct _)尝试使用over/partition它会抱怨。要解决此问题,您可以使用collect_set()获取分区中不同元素的数组,然后使用size()来计算元素。

<强>查询

select *
  , size(num_arr) dist_num
from (
  select *
    , collect_set(num) over (partition by grp) num_arr
  from db.tbl ) x

<强>输出

4   a   [4,3,1] 3
4   a   [4,3,1] 3
3   a   [4,3,1] 3
1   a   [4,3,1] 3
1   a   [4,3,1] 3
15  b   [15,14,10,9,8,7,6]  7
14  b   [15,14,10,9,8,7,6]  7
10  b   [15,14,10,9,8,7,6]  7
9   b   [15,14,10,9,8,7,6]  7
8   b   [15,14,10,9,8,7,6]  7
7   b   [15,14,10,9,8,7,6]  7
6   b   [15,14,10,9,8,7,6]  7
6   b   [15,14,10,9,8,7,6]  7
6   b   [15,14,10,9,8,7,6]  7
5   c   [5] 1

我在输出中包含了数组,因此您可以看到发生了什么,显然您可以在查询中丢弃它们。需要注意的是,在这里进行自我加入实际上是一场关于性能的灾难(而且还有更多的代码行)。

答案 1 :(得分:0)

根据您的要求,这可能有效:

select number,group1,COUNT(group1) OVER (PARTITION BY group1) as dist_num from table1;