Hive 解析 JSON 字符串数据的实现方式

文章目录

通过方法解析现实

在 Hive 中提供了直接解析 JSON 字符串数据的方法 get_json_object(json_txt, path),该方法参数解析如下:

  1. json_txt:顾名思义,就是 JSON 字符串;

  2. path:指的是匹配 JSON 字符串的格式,通过固定的语法获取 JSON 字符串中的内容。

常用的 path 参数匹配符号有四个,分别是:

  • $:表示获取整个 JSON 文件的根;

  • .:表示获取子元素;

  • []:表示获取列表;

  • *:表示获取列表中的元素。

示例

当前有一条 Maxwell 采集的 JSON 字符串数据,如下所示:

json 复制代码
{"database":"maxwell","table":"bootstrap","type":"insert","ts":1683629964,"xid":395746,"commit":true,"data":{"id":8,"database_name":"school","table_name":"test2","where_clause":null,"is_complete":0,"inserted_rows":0,"total_rows":0,"created_at":null,"started_at":null,"completed_at":null,"binlog_file":null,"binlog_position":0,"client_id":"maxwell","comment":null}}

下面在 Hive 中对其进行解析,为了方便解析,先将其存储到测试表中:

sql 复制代码
drop table if exists json_test;
create table json_test(json_txt string);
insert into json_test values('{"database":"maxwell","table":"bootstrap","type":"insert","ts":1683629964,"xid":395746,"commit":true,"data":{"id":8,"database_name":"school","table_name":"test2","where_clause":null,"is_complete":0,"inserted_rows":0,"total_rows":0,"created_at":null,"started_at":null,"completed_at":null,"binlog_file":null,"binlog_position":0,"client_id":"maxwell","comment":null}}');

-- 下面开始解析 JSON 字符串
select
	-- 先获取根然后再获取子元素
	get_json_object(json_txt,"$.database") `database`,
	get_json_object(json_txt,"$.table") `table`,
	get_json_object(json_txt,"$.type") `type`,
	get_json_object(json_txt,"$.ts") ts,
	get_json_object(json_txt,"$.xid") xid,

	-- 获取多级关系的内容就嵌套使用
	get_json_object(json_txt,"$.data.id") id,
	get_json_object(json_txt,"$.data.database_name") database_name,
	get_json_object(json_txt,"$.data.table_name") table_name
from
	json_test;

查询结果如下:

通过序列化实现

在 Hive 3.0.0 及以上版本中(在低版本中需要通过添加 Jar 包实现),内置了序列化 JSON 内容数据的包 JsonSerDe,在建表时指定序列化的格式,使用过程中就可以直接获取到 JSON 文件中的内容,无需进行手动解析操作。

hive-site.xml 文件中指定 Hive 表的序列化与反序列化器 SerDe

xml 复制代码
<property>
	<name>metastore.storage.schema.reader.impl</name>
	<value>org.apache.hadoop.hive.metastore.SerDeStorageSchemaReader</value>
</property>

添加完成后重启 Hive 服务,例如元数据库 metastore 或者 hiveserver2 远程连接。

示例

我们先进入 HDFS 上创建一个 JSON 目录文件,存储一条 JSON 数据用于测试:

json 复制代码
{"database":"maxwell","table":"bootstrap","type":"insert","ts":1683629964,"xid":395746,"commit":true,"data":{"id":8,"database_name":"school","table_name":"test2","where_clause":null,"is_complete":0,"inserted_rows":0,"total_rows":0,"created_at":null,"started_at":null,"completed_at":null,"binlog_file":null,"binlog_position":0,"client_id":"maxwell","comment":null}}

注意:文件中存储的 JSON 串必须是一行一条,不能手动跨越多行,不能格式化后存储,否则会引起 SerDe 解析异常:

shell 复制代码
java.io.IOException: org.apache.hadoop.hive.serde2.SerDeException: org.codehaus.jackson.JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (from [Source: java.io.ByteArrayInputStream@73c91482; line: 1, column: 0])

这里在 HDFS 上创建了目录 /json_dir,其中存储了 JSON 文件 json_file.txt

下面在 Hive 中创建表并对其进行解析:

sql 复制代码
drop table if exists json_test;
-- 其中定义的字段名对应 JSON 文件中的 KEY
-- 如果存在嵌套 JSON 子串,则需要使用结构体来进行定义
create table json_test(
	`database` string,
	`table` string,
	`type` string,
	`ts` string,
	`xid` bigint,
	`commit` string,
	`data` struct<id:bigint,database_name:string,table_name:string>)
row format serde 'org.apache.hadoop.hive.serde2.JsonSerDe'
stored as textfile
location '/json_dir'; -- 指定 JSON 文件的存储目录

查询字段内容:

sql 复制代码
select * from json_test;

如果想要获取嵌套 JSON 子串中的内容也很简单,如下所示:

sql 复制代码
select
    data.id,
    data.database_name,
    data.table_name
from json_test;

序列化与反序列解析 JSON 文件实战用的更多,更加方便快捷。

相关推荐
深空数字孪生3 小时前
储能调峰新实践:智慧能源平台如何保障风电消纳与电网稳定?
大数据·人工智能·物联网
百胜软件@百胜软件3 小时前
胜券POS:打造智能移动终端,让零售智慧运营触手可及
大数据
摩羯座-185690305944 小时前
Python数据可视化基础:使用Matplotlib绘制图表
大数据·python·信息可视化·matplotlib
在未来等你5 小时前
Kafka面试精讲 Day 13:故障检测与自动恢复
大数据·分布式·面试·kafka·消息队列
jiedaodezhuti5 小时前
Flink通讯超时问题深度解析:Akka AskTimeoutException解决方案
大数据·flink
庄小焱5 小时前
大数据存储域——Kafka实战经验总结
大数据·kafka·大数据存储域
zskj_qcxjqr6 小时前
告别传统繁琐!七彩喜艾灸机器人:一键开启智能养生新时代
大数据·人工智能·科技·机器人
每日新鲜事7 小时前
Saucony索康尼推出全新 WOOOLLY 运动生活羊毛系列 生动无理由,从专业跑步延展运动生活的每一刻
大数据·人工智能
在未来等你7 小时前
Kafka面试精讲 Day 15:跨数据中心复制与灾备
大数据·分布式·面试·kafka·消息队列
计算机编程-吉哥9 小时前
大数据毕业设计-基于Python的中文起点网小说数据分析平台(高分计算机毕业设计选题·定制开发·真正大数据)
大数据·hadoop·计算机毕业设计选题·机器学习毕业设计·大数据毕业设计·大数据毕业设计选题推荐·大数据毕设项目