当前位置: 代码网 > it编程>数据库>MsSqlserver > hive 列转行—collect_set()/collect_list()/concat_ws()函数的使用场景

hive 列转行—collect_set()/collect_list()/concat_ws()函数的使用场景

2024年08月04日 MsSqlserver 我要评论
【hive】列转行—collect_set()/collect_list()/concat_ws()函数的使用场景


一、collect_set()/collect_list():

在 hive 中想实现按某字段分组,对另外字段进行合并,可通过collect_list()或者collect_set()实现。

  • collect_set()函数与collect_list()函数:列转行专用函数,都是将分组中的某列转为一个数组返回。有时为了字段拼接效果,多和concat_ws()函数连用。

  • collect_set()与collect_list()的区别:

二、实际运用

1、创建测试表及插入数据 :

drop table test_1;
create table test_1(
id string,
cur_day string,
rule string
) 
row format delimited fields terminated by ',';

insert into test_1 values
('a','20230809','501'),('a','20230811','502'),('a','20230812','503'),('a','20230812','501'),('a','20230813','512'),('b','20230809','511'),('b','20230811','512'),('b','20230812','513'),('b','20230812','511'),('b','20230813','512'),('b','20230809','511'),('c','20230811','512'),('c','20230812','513'),('c','20230812','511'),('c','20230813','512');

把同一分组的不同行的数据聚合成一个行

举例1:按照id,cur_day分组,取出每个id对应的所有rule(不去重)。

select id,cur_day,collect_list(rule) as rule_total  from test_1 group by id,cur_day order by id,cur_day;

在这里插入图片描述

举例2:按照id,cur_day分组,取出每个id对应的所有rule(去重)。

select id,cur_day,collect_set(rule) as rule_total from test_1 group by id,cur_day order by id,cur_day;

set去重

  • 用下标可以随机取某一个
select id,cur_day,collect_list(rule)[0] as rule_one from test_1 group by id,cur_day order by id,cur_day;

select id,cur_day,collect_set(rule)[0] as rule_one from test_1 group by id,cur_day order by id,cur_day;

在这里插入图片描述

  • 聚合后的中的值用‘|’分隔开
select id,cur_day,concat_ws('|',collect_list(rule)) as rule_total from test_1 group by id,cur_day order by id,cur_day;

select id,cur_day,concat_ws('|',collect_set(rule)) as rule_total from test_1 group by id,cur_day order by id,cur_day;

在这里插入图片描述

例子

  • spark-sql : collect_list里边字段起别名.(as等其他方式都用过,都报错.
    最后用子查询来解决)
select fencecode,
       collect_list(struct(vehicleno, platecolor, entertime, levaetime, trans)) as actinfos
from (
    select fence_code as fencecode,
           veh_no as vehicleno,
           veh_color as platecolor,
           enter_time as entertime,
           out_time as levaetime,
           trans
    from mid.ct_fence_into_out_dt where dt = 20230911  
) subquery
group by fencecode;

总结

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com