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

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

文章目录

    • 通过方法解析现实
      • 示例
    • 通过序列化实现
      • 示例

通过方法解析现实

在 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
fromjson_test;

查询结果如下:

在这里插入图片描述

通过序列化实现

在 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

在这里插入图片描述

下面在 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;

在这里插入图片描述

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

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

在这里插入图片描述

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

相关文章:

  • Golang源码分析之golang/sync之singleflight
  • 【Java初阶练习题】-- 数组练习题
  • Qt界面美化之Qt Style Sheets
  • Ansible自动化安装部署及使用
  • 单链表基本操作的实现,初始化,头插,尾插,判空,获取个数,查找,删除,获取前置和后置位,清空,销毁
  • 在树莓派上使用Nginx搭建本地站点并通过内网穿透实现远程访问
  • 个人网站迁移
  • 由于找不到vcruntime140.dll无法继续执行代码
  • 【Qt6】QStringList
  • 【Midjourney入门教程3】写好prompt常用的参数
  • uniapp在APP端使用swiper进行页面不卡顿滑动
  • Eureka处理流程
  • 算法题:53. 最大子数组和(动态规划)Java Python 实现
  • Vue时间控件赋值后无法重选问题解决方案
  • 渗透工具使用及思路总结(持续更新)
  • php的引用
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • gf框架之分页模块(五) - 自定义分页
  • Github访问慢解决办法
  • Laravel 实践之路: 数据库迁移与数据填充
  • MySQL主从复制读写分离及奇怪的问题
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Redis 中的布隆过滤器
  • session共享问题解决方案
  • 从setTimeout-setInterval看JS线程
  • 前端自动化解决方案
  •  一套莫尔斯电报听写、翻译系统
  • 以太坊客户端Geth命令参数详解
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 【云吞铺子】性能抖动剖析(二)
  • ​第20课 在Android Native开发中加入新的C++类
  • # Apache SeaTunnel 究竟是什么?
  • # 达梦数据库知识点
  • #《AI中文版》V3 第 1 章 概述
  • #QT(串口助手-界面)
  • #在 README.md 中生成项目目录结构
  • (23)Linux的软硬连接
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)共用体union的用法举例
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (接口自动化)Python3操作MySQL数据库
  • (九十四)函数和二维数组
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四) Graphivz 颜色选择
  • (译) 函数式 JS #1:简介
  • (转)3D模板阴影原理
  • (转)母版页和相对路径
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET框架
  • .net专家(张羿专栏)
  • /3GB和/USERVA开关
  • @private @protected @public