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

这篇具有很好参考价值的文章主要介绍了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
from
	json_test;

查询结果如下:

Hive 解析 JSON 字符串数据的实现方式,hive,json,hadoop,数据仓库,大数据

通过序列化实现

在 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 解析 JSON 字符串数据的实现方式,hive,json,hadoop,数据仓库,大数据

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

Hive 解析 JSON 字符串数据的实现方式,hive,json,hadoop,数据仓库,大数据

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

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

Hive 解析 JSON 字符串数据的实现方式,hive,json,hadoop,数据仓库,大数据

序列化与反序列解析 JSON 文件实战用的更多,更加方便快捷。文章来源地址https://www.toymoban.com/news/detail-744986.html

到了这里,关于Hive 解析 JSON 字符串数据的实现方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hive 如何处理json字符串

    我们经常在线上会碰见一些json字符串需要在hive中处理,我在工作中碰见的就是常见的两种,一种是json字符串,一种是json数组,我们来讨论下这两种情况如何取到你想要的数据。 假设我们有个json字符串如下: 如果我们需要取到其中的age的字段,那么我们就需要使用hive中自

    2024年02月06日
    浏览(46)
  • mysql 解析json字符串、数组字符串、json数组字符串

    笔者使用mysql 5.7进行了一次json字符串的解析,因为一直在搞大数据相关的数据库、olap等,太久没有用mysql5.x的版本,一些函数已经不知道支不支持,我的同事建议我使用like、rlike模糊匹配的方式,身为数据人我不太喜欢用这种手段,因为他们比较低效。于是我想这里总结一下

    2024年02月16日
    浏览(56)
  • Oracle解析JSON字符串

    假设某个字段存储的JSON字符串,我们不想查出来后通过一些常见的编程语言处理( JSON.parse() 或者是 JSONObject.parseObject() 等),想直接在数据库上处理,又该如何书写呢? 其实在 ORACLE 中也支持多种机制去处理JSON数据,例如有操作函数JSON_ARRAY、JSON_EXISTS、JSON_VALUES、JSON_TABLE、

    2024年02月16日
    浏览(47)
  • Hive字符串数组json类型取某字段再列转行

    acct content 1232313 [{\\\"name\\\":\\\"张三\\\",\\\"code\\\":\\\"上海浦东新区89492jfkdajrn福建的卡\\\"...},{\\\"name\\\":\\\"狂徒\\\",\\\"code\\\":\\\"select * from table where aa=1rn and a=12\\\"...},{...}] ... ...  上述数据表名code_content,把json中code内容全都取出来拼接成一行数据,最终效果: acct new_content 1232313 上海浦东新区89492jfkdajrn福建的

    2024年02月11日
    浏览(49)
  • java解析多层嵌套json字符串

    在java 程序中,经常会涉及到各种变量值提取的问题,下面给出简单的示例及说明: JSON实际上也是键值对(\\\"key\\\":\\\"value\\\"),key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null) value如果是字符串,用jsonobj.getString(\\\"key\\\")获取 value如果是数

    2024年02月15日
    浏览(62)
  • java中对象转json字符串的常用方式

    1.使用Jackson库: Jackson是一个常用且功能强大的Java库,用于处理JSON数据。下面是使用Jackson将对象转换为JSON字符串的示例: 需要依赖: 2.使用Gson库: Gson是Google提供的一个Java库,它可以处理JSON数据的序列化和反序列化。以下是使用Gson将对象转换为JSON字符串的示例 相关依赖

    2024年02月07日
    浏览(48)
  • 一个退役中校教你如何用go语言写一个基于B+树的json数据库(进阶篇)之json字符串解析为BsTr结构(一)

    1.对象式json字符串 s := \\\"{\\\"put\\\":{\\\"putjsontest\\\":{\\\"aaa\\\":\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"aaab\\\":true,\\\"arrarrstrct\\\":{\\\"nnn\\\":-1234567890,\\\"ccc\\\":[[\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"nmbndfvdfgfdg\\\"],[\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"poiuiyyttt\\\"]]},\\\"ddd\\\":\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"fff\\\":false,\\\"comboolarr\\\":[{\\\"boolarr0\\\":[true,false]},{\\\"boolarr1\\\":[true,false]}]}

    2024年02月21日
    浏览(52)
  • C#2010 .NET4 解析 json 字符串

    下载Newtonsoft.Json.dll  

    2024年02月11日
    浏览(38)
  • 五分钟学会如何用java解析json字符串!

    在工作中我们常常使用json来存储和传输结构化的数据,如用户信息、配置信息等。它通常以string的方式进行传输,因此如何将string解析并得到我们想要的信息是一项必备且常用的功能。 JSON(JavaScript Object Notation)是一种轻量级的、基于文本的、与语言无关的数据交换格式,

    2024年02月11日
    浏览(43)
  • Golang校验字符串是否JSON格式方法json.Valid源码解析

    上篇文章《Golang中如何校验字符串是否为JSON格式?》主要讲解了使用json.Valid校验字符串是否JSON格式的使用方法,本文来剖析一下json.Valid方法的源码。 json.Valid方法定义: scan := newScanner() 获取一个 scanner 类型的对象,关键的是checkValid方法,checkValid源码如下: 首先调用了sc

    2023年04月26日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包