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 似乎是唯一的解决方案?
在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您将得到不同排序的结果
| 归档时间: |
|
| 查看次数: |
973 次 |
| 最近记录: |