根据 Presto/Hive 中的列值聚合列

Posted

技术标签:

【中文标题】根据 Presto/Hive 中的列值聚合列【英文标题】:Aggregating a column based on column values in Presto/Hive 【发布时间】:2018-11-07 12:52:03 【问题描述】:

我正在尝试创建一个数据集,在其中我根据另一列的值聚合一列。举个例子

 id      | score | id2 | offensive 
---------+-------+-----+-----------
 a1      | 1.2   | 1   | false     
 a2      | 36.0  | 1   | true      
 a3      | 1.2   | 1   | true      
 a4      | 36.0  | 1   | false  

我想要的最终是创建一个包含两个列表的数组,以按攻击性列和与之相关的 id 进行分组,并按得分值对它们进行排序。类似于以下内容:

 id      |id2  | clean_group | offensive_group
---------+-----+-------------+-----------------
 a1      | 1   | [a2, a3]    | [a4, a1]
 a2      | 1   | [a2, a3]    | [a4, a1]
 a3      | 1   | [a2, a3]    | [a4, a1]
 a4      | 1   | [a2, a3]    | [a4, a1]

我知道这是冗余数据,但这是要求,应该注意 id 将是不同且唯一的,并且 id2 都将相同。我一直在查看 presto 中的 array_agg 函数和 hive 中的 collect_set 来尝试完成此操作,但遇到了很多麻烦。

有人可以帮忙吗?我们是否能够以某种方式在我们所说的 array_agg(id where offensive=true) 等处传递条件。

【问题讨论】:

【参考方案1】:

我认为您希望使用过滤器语法进行聚合:array_agg(id) filter (where offensive)。这只会处理匹配过滤器的行。

【讨论】:

您对如何在 hive 中执行此操作有建议吗?是不是也一样? 我只用 Presto,所以不知道。【参考方案2】:

考虑到攻击性的列是一个字符串,我认为这应该对你有帮助

SELECT
 id,
 id2,
 CASE
  WHEN offensive = 'true' then concat_ws(',',collect_set(id))
 END AS clean_group,
 CASE
  WHEN offensive = 'false' then concat_ws(',',collect_set(id))
 END AS offensive_group
FROM
table_name; 

【讨论】:

比你!做类似collect_set(if(offensive=true, id, NULL)) AS offensive_group 的事情很有效:) 与你所说的非常相似 祝你好运?

以上是关于根据 Presto/Hive 中的列值聚合列的主要内容,如果未能解决你的问题,请参考以下文章

如何将一列的列值组合到 MySQL 中的另一列中?

将 pandas GroupBy 中的列值聚合为 dict

对最后一小时分组中的列值求和,然后将所有 5 的总和作为另一列中的总和

如何将 SQL 中的列中的值 PIVOT 到新的列名中,然后在这些 PIVOT 列下列出其他列值?

循环遍历一张表中的列值并将另一列中的 COUNTIF 值粘贴到另一张表中

如何根据一个数据帧中的列值和R中另一个数据帧的列标题名称有条件地创建新列