HIVE 列转行 字段分组截取随笔#collect_list/collect_set
背景:报案系统,每个用户的报案信息按照各自的当前的进展环节被记录,并且统一环节可能有多条记录,需取最近一次更新的记录。现要将所需的字段挑选出来并生成一行新的记录,保证一人一条记录,若无对应信息则显示NULL。
数据格式:id(bigint)为主键值;user_id(bigint)为用户;type(int)为不同的环节;context(string-key-value)为各环节对应的信息。
目标格式:
思路:
1、首先由于同一用户同一环节会有多次记录,需对同一type的进行排序,取出最新的记录。
通常的排序按照每条记录的创建时间order by,但当有主键时,按照主键排序也可行。
row_number() over(PARTITION BY user_id ,type ORDER BY id desc) row
注:desc 降序 asc 升序
2、接下来把同一用户的不同type下的context拼接成一个完整的context(array),方便后续统一取需要的信息。
2.1、首先想到用collect_list进行拼接,可以得到:
但在实际操作中发现,在任务开发平台,对type进行排序后拼接并不是按照type值的大小进行排序,而仍是根据字典排序。这使得后续打碎取value非常麻烦。但是此方法在hue可行(关系到本公司数据开发平台与hue的函数设置??)。
注:collect_list和collect_set。都是将分组中的某列转为一个数组返回,不同的是collect_list不去重而collect_set去重。
2.2 由于直接用collect_list无法按照type大小进行排序,于是考虑用map函数给每个value命名,即先map[type,context],再用collect_list得到array(map[type,context])格式。最后再取不同type的context时,context[60]无法取出,需要explode再分列。到此,开始反思一拼一分是否多此一举了?
2.3 重新思考最终要的格式与内容,最终要的不是array[context],要的是context中的部分value,并且单独拆成多个字段。这说明,context不一定要存储为一个字段。又要考虑type的排序问题,可以直接使用join,将不同的type的context按照我们要的顺序join起来不就好了。于是就很清楚了,
select…where type=1
join
select…where type=2
join
select…where type=3
对context直接通过get_jason_object获取即可
HIVE 列转行 字段分组截取随笔#collect_list/collect_set相关推荐
- hive 列转行_掌握这个SQL技巧超越80%的人——行转列/列转行
在做特征工程的时候,会经常会碰到一个场景,比如手上有一张用户表user,记录了用户某款产品每一天各个功能的使用次数,存储方式类似key-value键值结构.具体如下: 用户使用行为统计表user 此时 ...
- Hive列转行 (Lateral View + explode)详解
需求: <疑犯> 悬疑,动作,科幻,爱情 <lies> 悬疑,警匪,动作,心理,剧情 <战狼> 战争,动作,灾难转成如下格式:<疑犯> 悬疑 <疑 ...
- hive按照某个字段分组,然后获取每个分组中最新的n条数据
hive -e " use db; select t.advertId,t.exposureNum from (select advertId,exposureNum,ROW_NUMBER( ...
- mysql collectset_005.hive列转行 (collect_set() 去重)
一.问题 hive如何将 a b 1 a b 2 a b 3 c d 4 c d ...
- Hive 之collect_list/collect_set(列转行)
Hive笔记之collect_list/collect_set(列转行) Hive中collect相关的函数有collect_list和collect_set. 它们都是将分组中的某列转为一个数组返回 ...
- hive 如何将数组转成字符串_hive详细笔记(八)-Hive之列转行和行转列(附带讲解视频 )...
1 行转列 1.1 函数 CONCAT(string A/col, string B/col-):返回输入字符串连接后的结果,支持任意个输入字符串; CONCAT_WS(separator, str1 ...
- hive sql 行转列列转行
数据的存储有时候存在一个主键对应多行数据记录的情况,如果我们想把数据做行转列(合并)操作,就可以使用collect_set()和concat_ws()函数嵌套,返回string. concat_ws( ...
- Hive常用函数、列转行与行转列、开窗函数、UDF、UDTF
Hive函数.开窗函数.UDF.UDTF 1.系统内置函数 2.常用函数 2.1.关系运算 2.2.数值运算 2.3.条件函数 2.4.日期函数 2.5.字符串函数 2.6.Hive求WordCoun ...
- Hive SQL中的concat、concat_ws、concat_group列转行,行转列
目录 1.concat函数,concat_ws函数,concat_group函数 CONCAT() 函数 2.CONCAT_WS(SEPARATOR ,collect_set(column)) 等价于 ...
最新文章
- Java项目:兼职平台系统(java+Springboot+ssm+HTML+maven+Ajax+mysql)
- 继python(银行转账)简单Model修改版(二)
- 学习鸟哥的Linux私房菜笔记(5)——目录
- CentOS安装PPTP ×××
- Coprime Conundrum 容斥原理
- Android public class MyApplication extends MultiDexApplication使用
- 论文浅尝 | 基于复杂查询图编码的知识库问答
- github上传自己的项目
- 【毕业答辩】毕业设计答辩现场技巧
- tensorflow: deep_dream代码及原理分析
- SqlServer保留几位小数的两种做法
- 怎么从php文件中查找代码,php类在文件中查找类文件,但不查找类
- Unity3D圣典学习【2】之CharacterController
- linux 小度 驱动_在Linux下使用小度WiFi
- ArduinoUNO实战-第十七章-火焰传感器
- GPGPU-Sim学习(二)搭建GPGPU-Sim环境(ubuntuServer 10.04 安装GPGPU-Sim)
- Camera Raw图解析
- bulldog-vulnhub
- 互联网思维:毛利率变零下的硬件厂家将横尸遍野,华为这样的硬件公司何去何从
- 35岁 学java_35岁没基础,现在去学java编程还来得及吗?应该注意哪些事项?
热门文章
- weinre安装及使用
- 三菱je -c中映射表的作用_linux内核页表映射机制:线性地址如何转为物理地址?...
- 路由 OSPF LSA介绍、1~7类LSA详细介绍
- python高并发编程_python 并发编程
- 数据类型和存储上的差别,基本数据类型,引用数据类型
- C# 调用NationalInstruments的dll报错问题 未能加载文件或程序集
- /etc/xinetd.d 的使用
- Bootstrap 字体图标和自定义矢量图标
- 汽车零部件-线控底盘
- Unity五子棋游戏设计 和简单AI实现(1)