当前位置: 首页 > 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/a/304229.html

相关文章:

  • 【计算机网络】【网络层】【习题】
  • 尽量通俗易懂地概述.Net U nity跨语言/跨平台相关知识
  • 《情商》提升:增强自我意识,学会与情绪共处
  • SOLIDWORKS代理商鑫辰信息科技
  • 如何在Puppeteer中实现表单自动填写与提交:问卷调查
  • 【MySQL从入门到放弃】InnoDB磁盘结构(一)
  • 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