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

时间:2018-05-28 23:59:32

标签: hive hiveql presto

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

 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)等等。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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;