hadoop - Hive - 在组中添加具有不同值数量的列

标签 hadoop hive

假设我有以下数据。

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/

相关文章:

hadoop - Hadoop使用较小的硬盘添加datanode

hadoop - MapR 配置单元未检测到显示无效 URL 错误的 maprfs :///scheme,

hadoop - HIVE 抛出错误中的简单表创建

oracle - Hive- 检查子分区的解决方法

hadoop - 如何使用Apache Hadoop执行K-means?

java - 在 map 调用中获取 Spark 上的行

hadoop - 如何让 Pig 使用 lzo 文件?

hadoop - 表在 Hive 中不可见

hadoop - Hive 2.1.0:无法移动源

sql - Hive/SQL捆绑列中的几列,其余列是基于拉的最低/最高其他列