当前位置: 首页 > article >正文

将复杂类型列展开成多行,附带json解析

针对的问题:将数仓表中存储的json数组,展开多行后进行分析计算。

--HiveSQL
with tmp_score_table as 
(
  select '202401' as part_id,'2024级1班' as part_name
        ,'[{"stu_id":"20240101","score_1":99,"score_2":78},{"stu_id":"20240102","score_1":89,"score_2":100}]' as score_array 
  union all 
  select '202402' as part_id,'2024级2班' as part_name 
        ,'[{"stu_id":"20240201","score_1":88,"score_2":59},{"stu_id":"20240202","score_1":100,"score_2":71}]' as score_array 
) 
select part_id,part_name,scorealias.stu_id,scorealias.score_1,scorealias.score_2
from 
( 
   select part_id, part_name
         ,split(regexp_replace(regexp_replace(score_array,'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),'\\;') as score 
   from tmp_score_table  
) t1 
lateral view explode(t1.score) adtable as scoreview 
lateral view json_tuple(scoreview,'stu_id','score_1','score_2') scorealias as stu_id,score_1,score_2 
;

--SparkSQL
with tmp_score_table as 
(
  select '202401' as part_id,'2024级1班' as part_name
        ,'[{"stu_id":"20240101","score_1":99,"score_2":78},{"stu_id":"20240102","score_1":89,"score_2":100}]' as score_array 
  union all 
  select '202402' as part_id,'2024级2班' as part_name 
        ,'[{"stu_id":"20240201","score_1":88,"score_2":59},{"stu_id":"20240202","score_1":100,"score_2":71}]' as score_array 
) 
select part_id,part_name,json_tuple(score,'stu_id','score_1','score_2') as (stu_id,score_1,score_2) 
from 
( 
   select part_id, part_name 
         ,explode(split(regexp_replace(regexp_replace(score_array, '\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),'\\;')) as score 
   from tmp_score_table 
) t1 
;

1、关于explode函数:将数组或映射结构拆分为多个单独的行

SparkSQL支持explode函数,但是Hive不直接支持explode函数。这是因为explode是一个非标准的Hive函数,它是属于Hive的内置Lateral View语法的一部分。Hive有自己的内置LATERAL VIEW EXPLODE功能,可以用来解决类似的问题。

2、关于json_tuple函数:用于一个标准的JSON字符串中,按照输入的一组键(key1,key2,...)抽取各个键指定的字符串。

json_tuple()是输入一行,输出一行。SparkSQL支持json_tuple函数,但是其属于UDTF,而Hive对于UDTF是不能直接查询表字段的,要使用侧视图才行。

3、关于Hive函数lateral view

主要是将原本汇总在一条(行)的数据拆分成多条(行)成虚拟表,再与原表进行笛卡尔积,从而得到明细表。配合UDTF函数使用,一般情况下经常与explode函数搭配


http://www.kler.cn/news/304229.html

相关文章:

  • pandas 将多条记录整合成一条记录,每条记录的year和month字段组成新的字段名
  • MySQL从C盘迁移到D盘
  • Git的学习笔记
  • 服务器与个人计算机之间的区别
  • Java项目: 基于SpringBoot+mybatis+maven课程答疑系统(含源码+数据库+毕业论文)
  • 【Ubuntu】Ubuntu双网卡配置 实现内外网互不影响同时可用
  • KubeCon China 回顾|快手的 100% 资源利用率提升:从裸机迁移大规模 Redis 到 Kubernetes
  • 深度学习--对抗生成网络(GAN, Generative Adversarial Network)
  • Pr 入门系列之三:挑选与添加媒体到序列(上)
  • UQpy | 不确定性量化Python工具箱推荐
  • Spring和MyBatis常见面试题总结
  • 房屋租赁|基于springboot的房屋租赁管理系统设计与实现(附项目源码+论文+数据库)
  • python-游戏自动化(一)(实战-自动刷视频点赞)
  • activiti第五步流程图定义会审并设置串行用户任务
  • 在RabbitMQ中四种常见的消息路由模式
  • 电能质量监测装置和防孤岛装置在特斯拉工厂分布式光伏项目的应用
  • Node.js Express 框架
  • 6、Flume安装
  • 通信工程学习:什么是PC永久连接、SPC软永久连接
  • Open-Sora代码详细解读(2):时空3D VAE
  • 双流join
  • Vmware 傻瓜式安装( Linux 网络操作系统 01)
  • 【python计算机视觉编程——10.OpenCV】
  • python画图|3D surface基础教程
  • GO Server-Sent Events (SSE)
  • Linux 基础命令-系统信息查看
  • 可测试,可维护,可移植:上位机软件分层设计的重要性
  • 【Python机器学习】循环神经网络(RNN)——审察模型内部情况
  • 警惕!尿血背后隐藏的健康危机,你不可不知的五大原因!
  • PHP 线程,进程、并发、并行 的理解