一文速学-HiveSQL解析JSON数据详解+代码实战

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一文速学-HiveSQL解析JSON数据详解+代码实战

前言


JSON文件存储格式十分常见,在各个数据库中以及业务场景都有关于该文件的处理方式。但是有时候处理JSON文件在不同的数据库处理方法也不同,掌握一些高效的函数可以大大简化我们处理JSON数据格式的效率。面对一些复杂的存储形式,例如JSON数组存储这种就必须采取一定的处理方式,下面是处理HiveSQL解析JSON数据的函数与方法。


一、JSON数据


君欲擅其器,必先练其力。我们要对JSON文件有个熟悉的认知。


JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。


JSON是一个序列化的对象或数组。


   数据为  键 / 值 (name/value)对;

   数据由逗号(,)分隔;

   大括号保存对象(object);

   方括号保存数组(Array);

值可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个。值中的字面值中的英文必须使用小写。


如:


"code":"100"


对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成:


{“code”:20,"type":"mysql"}


数组是由方括号括起来的一组值构成:


"datesource":[
    {"code":"20", "type":"mysql"},
   {"code":"20", "type":"mysql"},
    {"code":"20", "type":"mysql"}
]


二、Hive解析函数


以我们经常存储的JSON文件为实例去展示操作:

{"level":"2","time":1650973942596,"type":"0"}

HiveSQL自带两个函数可以处理JSON文件,但是一次只能处理一个JSON文件。


1.get_json_object


get_json_object的基础语法格式为:


get_json_object(json_string, '$.key')


功能:解析json的字符串json_string,返回key指定的内容。如果输入的json字符串无效,那么返回NULL。这个函数每次只能返回一个数据项。

SELECT 
GET_JSON_OBJECT('{"level":"2","time":1650973942596,"type":"0"}','$.level' ) as level ;

1b3bca4cf3f04a419a9137cc87df82be.png


如果要解析JSON的所有字段可以多写几条:

SELECT 
GET_JSON_OBJECT('{"level":"2","time":1650973942596,"type":"0"}','$.level' ) as level,
GET_JSON_OBJECT('{"level":"2","time":1650973942596,"type":"0"}','$.time' ) as times,
GET_JSON_OBJECT('{"level":"2","time":1650973942596,"type":"0"}','$.type' ) as types;

ccfc775ad92b476ab0c222b6722e5235.png


2.json_tuple


为了解决get_json_object一次解析不了整个JSON文件的问题,我们就有了json_tuple这个函数,一条便能处理一条JSON数据,基础语法为:


json_tuple(json_string, k1, k2 ...)


解析json的字符串json_string,可指定多个json数据中的key,返回对应的value。如果输入的json字符串无效,那么返回NULL。

SELECT 
json_tuple('{"level":"2","time":1650973942596,"type":"0"}','level','time','type') as (level,times,types);

9de4f9f7874f4548b23cbc9f69a1c8c0.png


但是以上这两个函数都无法处理JSON数组,需要我们使用正则替换和explode函数清洗出每条独立的JSON数据才能处理。


3.explode


explode的基础语法为:


explode(Array OR Map)


功能:explode()函数接收一个array或者map类型的数据作为输入,然后将array或map里面的元素按照每行的形式输出,即将hive一列中复杂的array或者map结构拆分成多行显示,也被称为列转行函数。

SELECT explode(array(
'
{"level":"2","time":1650973942596,"type":"0"}',
'{"level":"1","time":1650973942597,"type":"1"}',
'{"level":"3","time":1650973942598,"type":"2"}
'
))

4ed36e14418540dd9d662e075257be7c.png

select explode(map('level',1,'time',1650973942596,'type',0))

d137021b68664fa99615680d9200c8ad.png


4.regexp_replace


regexp_replace就好比python里面的sub()匹配之后替换:

基础语法:


regexp_replace(string A, string B, string C)


功能:将字符串A中的符合java正则表达式B的部分替换为C。

select REGEXP_REPLACE('{"level":"2","time":1650973942596,"type":"0"}','2','1');

dff5003d8c45442cafb222cae8435f24.png


三、Hive解析JSON数组


我们先拿到一组JSON数组:


[{"level":"2","time":1650973942596,"type":"0"},


{"level":"1","time":1650973942597,"type":"1"},


{"level":"3","time":1650973942598,"type":"2"}]


我们想要把他们转换为一下格式,变成一下这种形式:


478b5481e52141988a00bea2eacd062a.png


第一步:

第一步我们要将数组外面的,给替换掉,以免后续我们按;划分展开。

SELECT 
    REGEXP_REPLACE('[{"level":"2","time":1650973942596,"type":"0"},{"level":"1","time":1650973942597,"type":"1"},{"level":"3","time":1650973942598,"type":"2"}]','\\}\\,\\{','\\}\\;\\{')


f50e0505651947cfa83014c7205b06be.png


第二步:


将数组两边的[]给去掉:


select
REGEXP_REPLACE( 
    REGEXP_REPLACE('[{"level":"2","time":1650973942596,"type":"0"},{"level":"1","time":1650973942597,"type":"1"},{"level":"3","time":1650973942598,"type":"2"}]','\\}\\,\\{','\\}\\;\\{')
    ,'\\[|\\]','')

第三步:


按分号我们进行划分:


SELECT 
    split(
    REGEXP_REPLACE( 
    REGEXP_REPLACE('[{"level":"2","time":1650973942596,"type":"0"},{"level":"1","time":1650973942597,"type":"1"},{"level":"3","time":1650973942598,"type":"2"}]','\\}\\,\\{','\\}\\;\\{')
    ,'\\[|\\]','')
    ,'\\;')


92f2736bec474771aff02eab61ddc553.png

第四步:


之后我们便可以使用explode进行平铺了:

select 
    explode(
    split(
    REGEXP_REPLACE( 
    REGEXP_REPLACE('[{"level":"2","time":1650973942596,"type":"0"},{"level":"1","time":1650973942597,"type":"1"},{"level":"3","time":1650973942598,"type":"2"}]','\\}\\,\\{','\\}\\;\\{')
    ,'\\[|\\]','')
    ,'\\;')
    )


06721ec3998b4e12abf6892bd6e49eea.png


第五步:


最后在此表的基础之上我们再使用get_json_object或者json_tuple函数就好了:


SELECT 
      GET_JSON_OBJECT(track,'$.level') as level,
      GET_JSON_OBJECT(track,'$.time') as times,
      GET_JSON_OBJECT(track,'$.type') as types
    from (
    select 
    explode(
    split(
    REGEXP_REPLACE( 
    REGEXP_REPLACE('[{"level":"2","time":1650973942596,"type":"0"},{"level":"1","time":1650973942597,"type":"1"},{"level":"3","time":1650973942598,"type":"2"}]','\\}\\,\\{','\\}\\;\\{')
    ,'\\[|\\]','')
    ,'\\;')
    )track )track

c7d327a23d1b4741ac16f4c53ad399bf.png

目录
相关文章
|
10天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3920 2
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
13天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
3天前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
8天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
34 10
|
5天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
91 1
|
8天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
14 1
|
18天前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
在Java中处理JSON数据:Jackson与Gson库比较
|
21天前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
52 2
|
6天前
|
JSON 前端开发 JavaScript
API接口商品详情接口数据解析
商品详情接口通常用于提供特定商品的详细信息,这些信息比商品列表接口中的信息更加详细和全面。以下是一个示例的JSON数据格式,用于表示一个商品详情API接口的响应。这个示例假定API返回一个包含商品详细信息的对象。
|
19天前
|
API
Vue3组件通信全解析:利用props、emit、provide/inject跨层级传递数据,expose与ref实现父子组件方法调用
Vue3组件通信全解析:利用props、emit、provide/inject跨层级传递数据,expose与ref实现父子组件方法调用
206 0

推荐镜像

更多