假设我有以下数据。
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)
方法?
最佳答案
您肯定想在这里使用窗口函数。我不确定您是如何从您尝试过的查询中得到 11 11
的;我 99% 确定,如果您尝试在 Hive 中使用 over/partition
count(distinct _)
,它会报错。要解决此问题,您可以使用 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
我将数组包含在输出中,这样您就可以看到发生了什么,显然您可以在查询中丢弃它们。如前所述,就性能而言,在这里进行自连接确实是一场灾难(而且代码行数更多)。
关于hadoop - Hive - 在组中添加具有不同值数量的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33279162/