背景:报案系统,每个用户的报案信息按照各自的当前的进展环节被记录,并且统一环节可能有多条记录,需取最近一次更新的记录。现要将所需的字段挑选出来并生成一行新的记录,保证一人一条记录,若无对应信息则显示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相关推荐

  1. hive 列转行_掌握这个SQL技巧超越80%的人——行转列/列转行

    在做特征工程的时候,会经常会碰到一个场景,比如手上有一张用户表user,记录了用户某款产品每一天各个功能的使用次数,存储方式类似key-value键值结构.具体如下: 用户使用行为统计表user 此时 ...

  2. Hive列转行 (Lateral View + explode)详解

    需求: <疑犯> 悬疑,动作,科幻,爱情 <lies> 悬疑,警匪,动作,心理,剧情 <战狼> 战争,动作,灾难转成如下格式:<疑犯> 悬疑 <疑 ...

  3. hive按照某个字段分组,然后获取每个分组中最新的n条数据

    hive -e " use db; select t.advertId,t.exposureNum from (select advertId,exposureNum,ROW_NUMBER( ...

  4. mysql collectset_005.hive列转行 (collect_set() 去重)

    一.问题 hive如何将 a       b       1 a       b       2 a       b       3 c       d       4 c       d       ...

  5. Hive 之collect_list/collect_set(列转行)

    Hive笔记之collect_list/collect_set(列转行) Hive中collect相关的函数有collect_list和collect_set. 它们都是将分组中的某列转为一个数组返回 ...

  6. hive 如何将数组转成字符串_hive详细笔记(八)-Hive之列转行和行转列(附带讲解视频 )...

    1 行转列 1.1 函数 CONCAT(string A/col, string B/col-):返回输入字符串连接后的结果,支持任意个输入字符串; CONCAT_WS(separator, str1 ...

  7. hive sql 行转列列转行

    数据的存储有时候存在一个主键对应多行数据记录的情况,如果我们想把数据做行转列(合并)操作,就可以使用collect_set()和concat_ws()函数嵌套,返回string. concat_ws( ...

  8. Hive常用函数、列转行与行转列、开窗函数、UDF、UDTF

    Hive函数.开窗函数.UDF.UDTF 1.系统内置函数 2.常用函数 2.1.关系运算 2.2.数值运算 2.3.条件函数 2.4.日期函数 2.5.字符串函数 2.6.Hive求WordCoun ...

  9. Hive SQL中的concat、concat_ws、concat_group列转行,行转列

    目录 1.concat函数,concat_ws函数,concat_group函数 CONCAT() 函数 2.CONCAT_WS(SEPARATOR ,collect_set(column)) 等价于 ...

最新文章

  1. Java项目:兼职平台系统(java+Springboot+ssm+HTML+maven+Ajax+mysql)
  2. 继python(银行转账)简单Model修改版(二)
  3. 学习鸟哥的Linux私房菜笔记(5)——目录
  4. CentOS安装PPTP ×××
  5. Coprime Conundrum 容斥原理
  6. Android public class MyApplication extends MultiDexApplication使用
  7. 论文浅尝 | 基于复杂查询图编码的知识库问答
  8. github上传自己的项目
  9. 【毕业答辩】毕业设计答辩现场技巧
  10. tensorflow: deep_dream代码及原理分析
  11. SqlServer保留几位小数的两种做法
  12. 怎么从php文件中查找代码,php类在文件中查找类文件,但不查找类
  13. Unity3D圣典学习【2】之CharacterController
  14. linux 小度 驱动_在Linux下使用小度WiFi
  15. ArduinoUNO实战-第十七章-火焰传感器
  16. GPGPU-Sim学习(二)搭建GPGPU-Sim环境(ubuntuServer 10.04 安装GPGPU-Sim)
  17. Camera Raw图解析
  18. bulldog-vulnhub
  19. 互联网思维:毛利率变零下的硬件厂家将横尸遍野,华为这样的硬件公司何去何从
  20. 35岁 学java_35岁没基础,现在去学java编程还来得及吗?应该注意哪些事项?

热门文章

  1. weinre安装及使用
  2. 三菱je -c中映射表的作用_linux内核页表映射机制:线性地址如何转为物理地址?...
  3. 路由 OSPF LSA介绍、1~7类LSA详细介绍
  4. python高并发编程_python 并发编程
  5. 数据类型和存储上的差别,基本数据类型,引用数据类型
  6. C# 调用NationalInstruments的dll报错问题 未能加载文件或程序集
  7. /etc/xinetd.d 的使用
  8. Bootstrap 字体图标和自定义矢量图标
  9. 汽车零部件-线控底盘
  10. Unity五子棋游戏设计 和简单AI实现(1)