Hive:如何在 group by 之后按顺序连接一列?

Hive: How to concat one column by order after group by?

数据集如下所示:

id 结果 排名
001 通过 2
002 失败 3
001 失败 1
002 通过 1

我想做的是:按 id 对数据集进行分组,然后按排名列的升序连接结果。

id 结果
001 失败-通过
002 通过-失败

由于涉及到其他列的顺序,concat_ws('-',collect_set(result))功能无法实现我的想法

是否有任何内置函数可以帮助我实现此目的,或者编写 UDF 似乎是唯一的解决方案?

在collect_set之前的一个子查询中,按id分布,按id排序,排序。数据集将按 id 在 reducer 之间分布,并在聚合前按等级排序。请参阅代码中的注释。

演示:

with demo_dataset as ( --Use your table instead of this CTE
select stack(4,
'001' , 'pass', 2,
'002' , 'fail', 3,
'001' , 'fail', 1,
'002' , 'pass', 1
) as (id,result,rank)
)

select id, concat_ws('-',collect_set(result))
from
(
select t.* 
  from demo_dataset t
distribute by id   --Distribute by grouping column
sort by id, rank   --Sort in required order
) s
group by id

结果:

id  results
001 fail-pass
002 pass-fail

现在,如果您更改排序方式:sort by id, rank desc 您将得到不同排序的结果