• 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}}
    
    • 1

    下面在 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    查询结果如下:

    在这里插入图片描述

    通过序列化实现

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

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

    <property>
    	<name>metastore.storage.schema.reader.implname>
    	<value>org.apache.hadoop.hive.metastore.SerDeStorageSchemaReadervalue>
    property>
    
    • 1
    • 2
    • 3
    • 4

    添加完成后重启 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}}
    
    • 1

    注意:文件中存储的 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])
    
    • 1

    这里在 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 文件的存储目录
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    查询字段内容:

    select * from json_test;
    
    • 1

    在这里插入图片描述

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

    select
        data.id,
        data.database_name,
        data.table_name
    from json_test;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

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

  • 相关阅读:
    package ‘XXXX’ is not available (for R version 3.6.0) 解决R版本适配的问题
    解决Nginx unknown directive “stream”问题
    [软件工程] UML 用例图详解
    Redis集群3.2.11离线安装详细版本(使用Ruby)
    Java基础:集合类之ArrayList、HashMap简介
    MATLAB | 一起来感受数学之美叭
    An工具介绍之形状工具及渐变变形工具
    2024年GPLT团体程序设计比赛L2-D吉利矩阵题解
    〖Python自动化测试实战篇⑥〗- 接口抓包工具 Chrome 的使用
    Java中常用的四种线程池
  • 原文地址:https://blog.csdn.net/weixin_46389691/article/details/134218166