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

news2024/11/29 7:54:16

文章目录

  • 一、collect_set()/collect_list()
  • 二、实际运用
    • 把同一分组的不同行的数据聚合成一个行
    • 用下标可以随机取某一个
    • 聚合后的中的值用‘|’分隔开
    • 使用collect_set()/collect_list()使得全局有序


一、collect_set()/collect_list()

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

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

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

    • collect_list()函数 - - 不去重
    • collect_set()函数 - - 去重

有点类似于Python中的列表与集合。


二、实际运用

创建测试表及插入数据

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_set(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_list(rule) as rule_total from test_1 group by id,cur_day order by id,cur_day;

在这里插入图片描述

用下标可以随机取某一个

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_totalfrom test_1 group by id,cur_day order by id,cur_day;

在这里插入图片描述

使用collect_set()/collect_list()使得全局有序

现在需求:严格按照同一个id进行分组,规则按时间升序排序,使用collect_list()将时间与规则按升序排序且一 一 对应展示出来。

1.原数据详情:

在这里插入图片描述
2.要求输出结果如下:按id分组,将rule按cur_day升序排序,将cur_day,rule放在一个列表中,并且列表中cur_day与rule是按升序一一对应的关系。
在这里插入图片描述

3.实现思路:将其使用row_number()over(partition by id order by cur_day as)排序,然后再使用collect_list()或者collect_list()/collect_set()进行聚合就可以了。

drop table test_2 ;
create table test_2 as 
select id,collect_list(cur_day),collect_list(rule) 
from (
select t.id,t.cur_day,t.rule,row_number() over(partition by id order by cur_day asc) rn from test_1 t
)t group by id ;

select * from test_2 group by id order by id;

在这里插入图片描述

4.发现问题:cur_day数组内的时间并没有按照升序排序输出。

5.原因分析:

  • HiveQL执行时,大部分情况都会转换为MR来执行,当开户多个Mapper的时候,Mapper1可能处理的是id为a,cur_day排名为1、2、3的数据,Mapper2可能处理的id为a,cur_day排名为4、5、6的数据。
  • collect_list()的底层是ArrayList来实现的,当put到ArrayList的时候,不一定是哪个Mapper先,哪个Mapper后,所以会出现20230811、20230812、20230813在20230809前面的情况。所以,row_number() over(partitiion by order by) 与collect_list一起使用只能实现局部有序,不能实现全局有序。

6.解决方案:

  • 方法一:全局 order by
drop table test_2 ;
create table test_2 as 
select id,collect_list(cur_day),collect_list(rule) 
from (
	select t.* from(
		select t.id,t.cur_day,t.rule,row_number() over(partition by id order by cur_day asc) rn from test_1 t
	) t order by rn 
)t group by id ;

select * from test_2 group by id order by id;

在这里插入图片描述

  • 方法二:distribute by + order by
select
id,collect_list(cur_day),collect_list(rule) 
from(
	select
	t.id,t.cur_day,t.rule
	,row_number()over(partition by id order by cur_day asc) as rn
	from(
		select
		t.id,t.cur_day,t.rule
		from test_1 t
		distribute by id sort by cur_day asc
	)t
)t 
group by id order by id;

在这里插入图片描述

  • 方法三:sort_array (只支持升序)
select
id,concat_ws(',',collect_list(cur_day)),regexp_replace(concat_ws(',',sort_array(collect_list(concat_ws('|' ,lpad(cast(rn as string),2,'0') ,rule)))),'\\d+\\|','') 
from(
select t.* 
from(
select
id,cur_day,rule,
row_number()over(partition by id order by cur_day asc) as rn
from test_1
)t order by rn
)t group by id order by id;

在这里插入图片描述

上面代码用到相关函数解析:

  • lpad(str,len,pad) 函数:这个是对排序值(也就是rule)来补位的,当要排序的值过大时,因为sort_array是按顺序对字符进行排序(即11会在2的前面),所以可以使用此函数补位(即将1,2,3,4变成01,02,03,04),这样就能正常排序了。

    • 第一个参数:你要补齐的字段值
    • 第二个参数:补齐之后总共的位数
    • 第三个参数:你要在左边填充的字符
  • regexp_replace(strA,strB,strC) 函数:将字符串A中的符合JAVA正则表达式B的部分替换为C,即排序之前将序号使用,跟需要的字段拼接,而排序之后,需要将序号和:去掉

  • sort_array(expr[, ascendingOrder])默认是升序排序,但其中可以带参数,默认为True,即按升序,如果输入False,就会按降序排序。

    • expr:一个可排序元素的 ARRAY 表达式。
    • ascendingOrder:可选的 BOOLEAN 表达式,默认值为 True,即按升序。
select id
,concat_ws(',',sort_array(collect_list(concat_ws('|' ,lpad(cast(rn as string),2,'0') ,rule)))) as middle_value --中间值
,regexp_replace(concat_ws(',',sort_array(collect_list(concat_ws('|' ,lpad(cast(rn as string),2,'0') ,rule)))),'\\d+\\|','')  as result_values --最终结果
from(
select t.* 
from(
select
id,cur_day,rule,
row_number()over(partition by id order by cur_day asc) as rn
from test_1
)t order by rn
)t group by id order by id;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM架构指令集--专用指令

四、状态寄存器专用指令 CPSR寄存器-N Z C V T为0时 为ARM状态 F为0时 为开启FIQ状态 I为0时 为开启IRQ状态 图1 图2 一开始都是SVC指令,因为在操作系统启动的时候,在做一些初始化的操作,不允许被打断 图3 复位后CPSR寄存器为0xD3--…

YOLO物体检测-系列教程4:YOLOV3项目实战1(coco图像数据集/darknet预训练模型)

1、整体项目 1.1 环境 一个有debug功能的IDE,建议PycharmPyTorch深度学习开发环境下载COCO数据集: 训练集,是很大的数据验证集,是很大的数据 1.2 数据 依次进入以下地址: 项目位置\PyTorch-YOLOv3\data\coco\imag…

elasticsearch基础篇

目录 1.mysql与elasticsearch 2.索引库操作 2.1.mapping映射属性 2.2.索引库的CRUD 2.2.1.创建索引库和映射 2.2.2.查询索引库 2.2.3.修改索引库 2.2.4.删除索引库 2.2.5.总结 3.文档操作 3.1.新增文档 3.2.查询文档 3.3.删除文档 3.4.修改文档 3.4.1.全量修改 …

QT6 C++ qDebug()输出中文乱码解决方法

1.“工具”->“选项” 2.“文本编辑器“->”Behaior(行为)“->默认编码修改为UTF-8 3.“编辑”->“Select Encoding”->选择UTF-8 4.再次编译运行,可以输出显示中文

Springboot 集成 Ehcache操作数据库显示SQL语句设置

Springboot 集成 Ehcache操作数据库显示SQL语句设置 2023-09-13 23:33:35.030 INFO 6124 --- [ task-1] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2023-09-13 23:33:35.124 INFO 6124 --- [ …

24.Xaml ListView控件-----显示数据

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

为保障小程序安全,安装SSL证书是必要的选择

随着小程序的蓬勃发展&#xff0c;用户对于安全性和隐私保护的关注也日益增加。在这样的背景下&#xff0c;安装SSL证书成为保障小程序安全的重要措施之一。本文将为您详细介绍安装SSL证书的原因及其带来的益处。 首先&#xff0c;SSL证书可以保护用户数据的安全性。通过为小程…

开源视频监控服务器Shinobi

什么是 Shinobi ? Shinobi 是用 Node.JS 编写的开源 CCTV 解决方案。采用多帐户系统、WebSocket Streams 和直接保存到 MP4 的设计。Shinobi 提供了一个基于 Web 的用户界面&#xff0c;使用户可以通过浏览器来查看和管理监控视频&#xff0c;Shinobi 支持多个品牌的摄像头和网…

【2023】数据挖掘课程设计:基于TF-IDF的文本分类

目录 一、课程设计题目 基于TF-IDF的文本分类 二、课程设计设置 1. 操作系统 2. IDE 3. python 4. 相关的库 三、课程设计目标 1. 掌握数据预处理的方法&#xff0c;对训练集数据进行预处理&#xff1b; 2. 掌握文本分类建模的方法&#xff0c;对语料库的文档进行建模…

Linux内核4.14版本——drm框架分析(14)——Atomic KMS 架构(struct drm_atomic_state)

目录 1. drm_atomic_state_alloc创建drm_atomic_state 1.1 drm_atomic_state_init 2. 各个drm object对应的state 2.1 drm_atomic_get_crtc_state 2.2 drm_atomic_get_plane_state 2.3 drm_atomic_get_connector_state 2.4 struct __drm_{object}_state 我们从前面两篇文…

excel中的引用与查找函数篇2

如下所有案例中表头均不参与范围查找内&#xff1a; 1、LOOKUP(lookup_value,lookup_vector,[result_vector])&#xff1a;在一行或者一列中查找某个值并从另一行或者列中找到同位置的值 记住&#xff1a;中括号内的参数可以不赋值&#xff0c;若在中间用逗号隔开这个参数&…

【Flink实战】Flink自定义的Source 数据源案例-并行度调整结合WebUI

&#x1f680; 作者 &#xff1a;“大数据小禅” &#x1f680; 文章简介 &#xff1a;【Flink实战】玩转Flink里面核心的Source Operator实战 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 目录导航 什么是Flink的并行度Flink自定义的Source 数据…

阿里云通义千问大模型正式开放;玩10次ChatGPT就要消耗1升水

&#x1f989; AI新闻 &#x1f680; 阿里云通义千问大模型正式开放&#xff0c;已有超20万企业申请接入测试 摘要&#xff1a;阿里云通义千问大模型已经通过备案并向公众开放。用户可以登录官网体验&#xff0c;企业用户可以通过阿里云调用API。阿里云通义千问在一个月的邀测…

《确保安全:PostgreSQL安全配置与最佳实践》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

go并发处理业务

引言 实际上&#xff0c;在服务端程序开发和爬虫程序开发时&#xff0c;我们的大多数业务都是IO密集型业务&#xff0c;什么是IO密集型业务&#xff0c;通俗地说就是CPU运行时间只占整个业务执行时间的一小部分&#xff0c;而剩余的大部分时间都在等待IO操作。 IO操作包括htt…

uniapp 触底加载

方式一 onReachBottomDistance 缺点&#xff1a;需要整个页面滑动&#xff0c;局部滑动触发不了 { // pages.json // 路由下增加 onReachBottomDistance "path": "detailed/detailed","style": {"navigationBarTitleText": "收…

cpu温度监测 Turbo Boost Switcher Pro for mac最新

Turbo Boost Switcher Pro是一款Mac电脑上的应用程序&#xff0c;旨在帮助用户控制和管理CPU的Turbo Boost功能。Turbo Boost是Intel处理器中的一项技术&#xff0c;可以在需要更高性能时自动提高处理器的频率。然而&#xff0c;这可能会导致电池消耗更快和温度升高。 以下是T…

《计算机视觉中的多视图几何》笔记(2)

Projective Geometry and Transformations of 2D 本章主要介绍本书必要的几何知识与符号。 文章目录 Projective Geometry and Transformations of 2D2.1 Planar geometry2.2 The 2D projective plane2.2.1 Points and lines 2.2.2 Ideal points and the line at infinity2.2…

elementui 中 DateTimePicker 组件时间自定义格式化

elementui 中 DateTimePicker 组件时间自定义格式化 需求分析 需求 elementui 中 DateTimePicker 组件时间自定义格式化 自定义需求&#xff1a;需要获取到 DateTimePicker 组件时间的值为[“2023/9/5 20:2”,“2023/9/4 2:10”] 分析 源码如下&#xff1a; <el-date-pick…

TypeScript类型兼容:协变和逆变

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 引言 协变&#xff08;Covariance&#xff09; 协变&#xff1a;类型的向下兼容性 逆变&#xff08;Contravaria…