目录

一、前言

二、样例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】大数据的排序和拼接相关推荐

  1. Hive大数据-Hive的安装与启动---大数据之Hive工作笔记0005

    然后我们再去看这个hive的安装,其实正确的学习路径应该是,首先去看 一下hadoop,因为大数据中,很多知识都是基于hadoop的,然后再去看hive,然后再去 看hbase,spark,flink ...

  2. Hive 大数据表性能调优

    大数据应用程序开发人员在从 Hadoop 文件系统或 Hive 表读取数据时遇到了挑战. 合并作业(一种用于将小文件合并为大文件的技术)有助于提高读取 Hadoop 数据的性能. 通过合并,文件的数量 ...

  3. Hive大数据项目实践

    在搭建了Hadoop和hive环境后,就可以使用hive来进行数据库相关操作了.Hive提供了hql(类sql)语句来操作,基本过程与mysql类似,区别的就是对于hive中的聚合操作,将使用hado ...

  4. hive大数据倾斜总结

    在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平 ...

  5. HIVE大数据出现倾斜怎么办

    hive在跑数据时经常会出现数据倾斜的情况,使的作业经常reduce完成在99%后一直卡住,最后的1%花了几个小时都没跑完,通过YARN的管理界面配合日志,可以清楚其中的具体原因,这种情况就很可能是数 ...

  6. hive 大数据 除重问题研究

    Hive 典型的中表内数据除重写法 insert overwrite table store select t.p_key,t.sort_word from ( select p_key, sort_ ...

  7. 外排序(大数据文件排序)

    内排序方法的共同特点是在排序的过程中所有数据都在内存中.但是当待排序的记录数目特别多时,在内存中不能一次处理.必须把他们以文件的形式存放于外存,排序时再把他们一部分一部分地调入内存进行处理.这样,在排 ...

  8. 管理博文Hive大数据-Mysql的安装和启动---大数据之Hive工作笔记0007

    然后我们看,在给hive切换derby数据为,mysql数据库前,先去安装一下 mysql,这个已经安装了很多遍了 找到连接器,mysql的,然后 然后去看一下把这个mysql的驱动,copy到 hi ...

  9. Hive大数据-Hive的架构---大数据之Hive工作笔记0003

    然后我们再来看一下hive的架构 可以看到hive,左边有个元数据存储,就是存了一些元数据,通过这些元数据我们可以,找到具体我们存的实际的数据. 然后右边hive提供了cli命令行的方式操作hive以 ...

最新文章

  1. QIIME 2用户文档. 7差异丰度分析gneiss(2018.11)
  2. Android Retrofit实现原理分析
  3. 数字图像基础(二进制图像、灰度图像、RGB图像、索引图像和多帧图像)
  4. java 8u111 8u112_JDK 8U112
  5. 用jedis访问Redis进行对象存取示例
  6. mac查看端口,关闭进程
  7. Yarn管理界面中各个参数和yarn-site.xml中参数的对应关系
  8. 2018-2019-1 20165320 20165325 20165337 实验一 开发环境的熟悉
  9. VS快速生成JSON数据格式对应的实体
  10. 如何让程序集在每次编译时自动产生不同的版本号
  11. 黄聪:mysql 存在该记录则更新,不存在则插入记录的sql
  12. 【转】B树的插入和删除
  13. Hibernate的使用
  14. ROBOTSTXT_OBEY
  15. Installshield2008教程
  16. 新大陆云平台的.jar .sdk打包
  17. vba 涉及合并取消合并单元格
  18. 背单词App开发日记3
  19. 什么是NAT模式、路由模式
  20. java telephony jar_编译错误解决方法

热门文章

  1. 属性重要性的举例(定性数据聚类)
  2. 【小米盒子1代 (MDZ-05-AA)版本降级完美教程】
  3. vmware 14 安装window 7时,出现Network boot from Intel E1000
  4. 压缩包文件,解压密码可以删除吗?
  5. Shader入门数学知识-向量基础
  6. 生死狙击2服务器响应,当年电脑课上偷玩的游戏出新作了?生死狙击2成国产FPS标杆!...
  7. java 实现重定义数组类似于VB的ReDim
  8. matlab 中的del2函数
  9. 【英语】人生千变万化,不要因挫折而苦恼
  10. 树莓派局域网文件服务器,树莓派局域网文件共享