如何在分组后按顺序连接一列?

cni*_*aye 2 sql arrays hive concatenation hiveql

数据集如下所示:

ID 结果
001 经过 2
002 失败 3
001 失败 1
002 经过 1

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

ID 结果
001 失败通过
002 过关失败

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

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

lef*_*oin 5

在collect_set之前的子查询中,按id分发并按id、rank排序。数据集将在聚合之前按 id 分布在减速器之间并按排名排序。请参阅代码中的注释。

演示:

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
Run Code Online (Sandbox Code Playgroud)

结果:

id  results
001 fail-pass
002 pass-fail
Run Code Online (Sandbox Code Playgroud)

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