hive-add列,其中包含组中不同值的数量

carvr3hs  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(443)

假设我有以下数据。

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 但我想也许有一个更简单的解决方法,例如使用 over(partition by group) 方法?

lb3vh1jj

lb3vh1jj1#

根据您的要求,这可能适用于:

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

ugmeyewa2#

你肯定想在这里使用窗口功能。我不太清楚你是怎么做到的 11 11 从你的提问中;我99%肯定如果你想 count(distinct _) 在Hive里 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

我在输出中包含了数组,这样您就可以看到发生了什么,显然您可以在查询中丢弃它们。如前所述,在这里进行自连接对于性能来说确实是一场灾难(而且需要更多的代码行)。

相关问题