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
您将得到不同排序的结果
数据集如下所示:
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
您将得到不同排序的结果