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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: Hive 提供 `get_json_object` 函数解析 JSON 字符串,如 `{"database":"maxwell"}`。`path` 参数使用 `$`、`.`、`[]` 和 `*` 来提取数据。示例中展示了如何解析复杂 JSON 并存储到表中。此外,Hive 3.0.0及以上版本内置 `JsonSerDe` 支持直接处理 JSON 文件,无需手动解析。创建表时指定 `JsonSerDe` 序列化器,并在 HDFS 上存放 JSON 文件,可以直接查询字段内容,方便快捷。

@[toc]

通过方法解析现实

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

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

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

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

  • $:表示获取整个 JSON 文件的根;
  • .:表示获取子元素;
  • []:表示获取列表;

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

示例

当前有一条 Maxwell 采集的 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 中对其进行解析,为了方便解析,先将其存储到测试表中:

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;

查询结果如下:

image.png

通过序列化实现

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

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

<property>
    <name>metastore.storage.schema.reader.impl</name>
    <value>org.apache.hadoop.hive.metastore.SerDeStorageSchemaReader</value>
</property>

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

示例

我们先进入 HDFS 上创建一个 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 解析异常:

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

image.png

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

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 文件的存储目录

查询字段内容:

select * from json_test;

image.png

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

select
    data.id,
    data.database_name,
    data.table_name
from json_test;

image.png

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

相关文章
|
4天前
|
存储 JSON JavaScript
使用Python处理JSON格式数据
使用Python处理JSON格式数据
|
4天前
|
JSON JavaScript 测试技术
掌握JMeter:深入解析如何提取和利用JSON数据
Apache JMeter教程展示了如何提取和使用JSON数据。创建测试计划,包括HTTP请求和JSON Extractor,设置变量前缀和JSON路径表达式来提取数据。通过Debug Sampler和View Results Tree监听器验证提取结果,然后在后续请求和断言中使用这些数据。此方法适用于复杂测试场景,提升性能和自动化测试效率。
13 0
|
1天前
|
JSON 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在使用CDAS语法同步MySQL数据到Hologres时,如果开启了字段类型宽容模式,MySQL中的JSON类型会被转换为什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2天前
|
JSON JavaScript 前端开发
js将json字符串还原为json
【6月更文挑战第15天】js将json字符串还原为json
11 4
|
3天前
|
JSON API 数据格式
如何用 Python 的 requests 库发送 JSON 数据的 POST 请求
使用 requests 库发送 JSON 数据的 POST 请求是一个非常简单且实用的操作。通过将目标 URL 和 JSON 数据传递给 requests.post 方法,你可以轻松发送请求并处理响应。本篇文章介绍了从安装 requests 库,到发送 JSON 数据的 POST 请求,再到处理响应的整个流程。希望这篇文章能帮助你更好地理解并应用这个强大的 HTTP 请求库。
|
3天前
|
JSON Go 数据格式
【golang】json数据解析 - 嵌套json解析
【golang】json数据解析 - 嵌套json解析
5 0
|
4天前
|
JSON 数据格式 Python
python3 服务端使用CGI脚本处理POST的Json数据
python3 服务端使用CGI脚本处理POST的Json数据
21 6
|
4天前
|
JSON Java 数据格式
java读取接口返回的json数据 (二)
java读取接口返回的json数据 (二)
17 5
|
4天前
|
JSON Java 数据格式
java读取接口返回的json数据
java读取接口返回的json数据
17 5
|
1月前
|
SQL 数据采集 数据挖掘
大数据行业应用之Hive数据分析航班线路相关的各项指标
大数据行业应用之Hive数据分析航班线路相关的各项指标
125 1

热门文章

最新文章

推荐镜像

更多