【Hive】大数据的排序和拼接
目录
一、前言
二、样例SQL
三、函数用法
四、思路解析
一、前言
在大数据开发中有时会有这样的需求:将多条数据中的某个字段通过排序拼接为一个字段。
name oid
赵一 80
钱二 190
孙三 40得到结果:190|80|40
二、样例SQL
select
regexp_replace (concat_ws("|",sort_array (collect_set (concat_ws(":",concat(IF (order_id< 10,"000",IF (order_id< 100,"00",IF (order_id< 1000,"0",""))),order_id),oid)))),"\\d+\:","") oids
from
(select
oid,
row_number() over (PARTITION BY name ORDER BY oid DESC) order_id
from a) a;
三、函数用法
1.regexp_replace(source, pattern, replace_string, occurrence)
● source:string类型,要替换的原始字符串。
● pattern:string类型常量,要匹配的正则模式,pattern为空串时抛异常。
● replace_string:string,将匹配的pattern替换成的字符串。
● occurrence:bigint类型常量,必须大于等于0,默认是0,大于0:表示将第几次匹配替换成replace_string,等于0:表示替换掉所有的匹配子串。其它类型或小于0抛异常。2.concat_ws(separator,str1,str2,…)
concat_ws() 代表concat with separator,是concat()的特殊形式。第一个参数separator是其它参数的分隔符。会忽略所有的NULL值。3.concat(str1,str2,…)
直接将参数拼接起来,和concat_ws的区别是没有专门放分隔符的参数。4.sort_array
将列表进行升序排序
排序逻辑为按字母序排序,也就是说10会排在2之前。5.collect_set
返回一个数组或者说是列转行,去除重复元素,与sort_array搭配可以实现升序排序。6.collect_list
返回一个数组或者说是列转行,不去除重复元素,与sort_array搭配可以实现升序排序。7.row_number() over (PARTITION BY X ORDER BY Y DESC)
具有分组排序的功能
PARTITION BY:用于给结果集分组
ORDER BY:排序
四、思路解析
1.在内层SQL中获取到oid字段以及排序字段order_id。
select
oid,
row_number() over (PARTITION BY name ORDER BY oid DESC) order_id
from a80 2
190 1
40 3
2.但是order_id不能直接用于排序拼接,原因是排序函数sort_array的排序逻辑是字母序升序排序,也就是10会排在2之前,因为10的首位1要比2小。所以这里用到concat将order_id填充成一个四位数字,10填充为0010,2填充为0002。这样我们就有了排序字段。
concat(IF (order_id< 10,"000",IF (order_id< 100,"00",IF (order_id< 1000,"0",""))),order_id)
3.将排序字段和结果字段oid用冒号作为分隔符拼接在一起。
concat_ws(":",concat(IF (order_id< 10,"000",IF (order_id< 100,"00",IF (order_id< 1000,"0",""))),order_id),oid)0002:80
0001:190
0003:40
4.将排序字段和结果字段拼接之后的字段升序排序。这里的升序排序是按照冒号之前的四位数来排序的。用到函数sort_array、collect_set或者collect_list。
sort_array (collect_set (concat_ws(":",concat(IF (order_id< 10,"000",IF (order_id< 100,"00",IF (order_id< 1000,"0",""))),order_id),oid)))0001:190
0002:80
0003:40
5.将升序排序之后的数据拼接起来。
concat_ws("|",sort_array (collect_set (concat_ws(":",concat(IF (order_id< 10,"000",IF (order_id< 100,"00",IF (order_id< 1000,"0",""))),order_id),oid))))0001:190|0002:80|0003:40
6.将四位数和冒号替换为空。到这一步就得到了想要的结果。
regexp_replace (concat_ws("|",sort_array (collect_set (concat_ws(":",concat(IF (order_id< 10,"000",IF (order_id< 100,"00",IF (order_id< 1000,"0",""))),order_id),oid)))),"\\d+\:","")190|80|40
7.如果想得到40|80|190的结果就把内层SQL中的order_id升序排列。
select
oid,
row_number() over (PARTITION BY name ORDER BY oid ASC) order_id
from a80 2
190 3
40 1
8.需要注意的是oid不能为NULL,否则与四位数的order_id拼接之后就只剩下四位数。得不到最终想要的拼接结果。
concat_ws(':',0001,NULL)得到结果是0001
【Hive】大数据的排序和拼接相关推荐
- Hive大数据-Hive的安装与启动---大数据之Hive工作笔记0005
然后我们再去看这个hive的安装,其实正确的学习路径应该是,首先去看 一下hadoop,因为大数据中,很多知识都是基于hadoop的,然后再去看hive,然后再去 看hbase,spark,flink ...
- Hive 大数据表性能调优
大数据应用程序开发人员在从 Hadoop 文件系统或 Hive 表读取数据时遇到了挑战. 合并作业(一种用于将小文件合并为大文件的技术)有助于提高读取 Hadoop 数据的性能. 通过合并,文件的数量 ...
- Hive大数据项目实践
在搭建了Hadoop和hive环境后,就可以使用hive来进行数据库相关操作了.Hive提供了hql(类sql)语句来操作,基本过程与mysql类似,区别的就是对于hive中的聚合操作,将使用hado ...
- hive大数据倾斜总结
在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平 ...
- HIVE大数据出现倾斜怎么办
hive在跑数据时经常会出现数据倾斜的情况,使的作业经常reduce完成在99%后一直卡住,最后的1%花了几个小时都没跑完,通过YARN的管理界面配合日志,可以清楚其中的具体原因,这种情况就很可能是数 ...
- hive 大数据 除重问题研究
Hive 典型的中表内数据除重写法 insert overwrite table store select t.p_key,t.sort_word from ( select p_key, sort_ ...
- 外排序(大数据文件排序)
内排序方法的共同特点是在排序的过程中所有数据都在内存中.但是当待排序的记录数目特别多时,在内存中不能一次处理.必须把他们以文件的形式存放于外存,排序时再把他们一部分一部分地调入内存进行处理.这样,在排 ...
- 管理博文Hive大数据-Mysql的安装和启动---大数据之Hive工作笔记0007
然后我们看,在给hive切换derby数据为,mysql数据库前,先去安装一下 mysql,这个已经安装了很多遍了 找到连接器,mysql的,然后 然后去看一下把这个mysql的驱动,copy到 hi ...
- Hive大数据-Hive的架构---大数据之Hive工作笔记0003
然后我们再来看一下hive的架构 可以看到hive,左边有个元数据存储,就是存了一些元数据,通过这些元数据我们可以,找到具体我们存的实际的数据. 然后右边hive提供了cli命令行的方式操作hive以 ...
最新文章
- QIIME 2用户文档. 7差异丰度分析gneiss(2018.11)
- Android Retrofit实现原理分析
- 数字图像基础(二进制图像、灰度图像、RGB图像、索引图像和多帧图像)
- java 8u111 8u112_JDK 8U112
- 用jedis访问Redis进行对象存取示例
- mac查看端口,关闭进程
- Yarn管理界面中各个参数和yarn-site.xml中参数的对应关系
- 2018-2019-1 20165320 20165325 20165337 实验一 开发环境的熟悉
- VS快速生成JSON数据格式对应的实体
- 如何让程序集在每次编译时自动产生不同的版本号
- 黄聪:mysql 存在该记录则更新,不存在则插入记录的sql
- 【转】B树的插入和删除
- Hibernate的使用
- ROBOTSTXT_OBEY
- Installshield2008教程
- 新大陆云平台的.jar .sdk打包
- vba 涉及合并取消合并单元格
- 背单词App开发日记3
- 什么是NAT模式、路由模式
- java telephony jar_编译错误解决方法
热门文章
- 属性重要性的举例(定性数据聚类)
- 【小米盒子1代 (MDZ-05-AA)版本降级完美教程】
- vmware 14 安装window 7时,出现Network boot from Intel E1000
- 压缩包文件,解压密码可以删除吗?
- Shader入门数学知识-向量基础
- 生死狙击2服务器响应,当年电脑课上偷玩的游戏出新作了?生死狙击2成国产FPS标杆!...
- java 实现重定义数组类似于VB的ReDim
- matlab 中的del2函数
- 【英语】人生千变万化,不要因挫折而苦恼
- 树莓派局域网文件服务器,树莓派局域网文件共享