假设我有以下数据。
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)
方法?
2条答案
按热度按时间lb3vh1jj1#
根据您的要求,这可能适用于:
ugmeyewa2#
你肯定想在这里使用窗口功能。我不太清楚你是怎么做到的
11 11
从你的提问中;我99%肯定如果你想count(distinct _)
在Hive里over/partition
它会抱怨的。你可以用collect_set()
获取分区中不同元素的数组,然后可以使用size()
数数元素。查询:
输出:
我在输出中包含了数组,这样您就可以看到发生了什么,显然您可以在查询中丢弃它们。如前所述,在这里进行自连接对于性能来说确实是一场灾难(而且需要更多的代码行)。