自己做购物网站,wordpress电子书,app开发外包服务,免费的网站认证文章目录 通过方法解析现实示例 通过序列化实现示例 通过方法解析现实
在 Hive 中提供了直接解析 JSON 字符串数据的方法 get_json_object(json_txt, path)#xff0c;该方法参数解析如下#xff1a; json_txt#xff1a;顾名思义#xff0c;就是 JSON 字符串#xff1b;… 文章目录 通过方法解析现实示例 通过序列化实现示例 通过方法解析现实
在 Hive 中提供了直接解析 JSON 字符串数据的方法 get_json_object(json_txt, path)该方法参数解析如下 json_txt顾名思义就是 JSON 字符串 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
propertynamemetastore.storage.schema.reader.impl/namevalueorg.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.ByteArrayInputStream73c91482; 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 structid: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 文件实战用的更多更加方便快捷。