hive get_json_object解析json结果为null咋办?

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 解决get_json_object解析json结果为null的问题

前言

最近一位开发的同学在使用get_json_object函数对json数据解析的时候,出现了结果为null的问题,问题原因是sql语法导致的,那么今天就来详细介绍一下解析json函数的用法!

一、了解hive中处理json的两个函数

1. get_json_object函数

先看看这个函数具体是如何定义的:

执行命令:

desc function extended get_json_object;

执行结果:

get_json_object(json_txt, path) - Extract a json object from path 
Extract json object from a json string based on json path specified, and return json string of the extracted json object. It will return null if the input json string is invalid.
A limited version of JSONPath supported:
  $   : Root object
  .   : Child operator
  []  : Subscript operator for array
  *   : Wildcard for []
Syntax not supported that's worth noticing:
 ''  : Zero length string as key
 ..  : Recursive descent
 @   : Current object/element
 ()  : Script expression
 ?() : Filter (script) expression.
 [,] : Union operator
 [start:end:step] : array slice operator
Function class:org.apache.hadoop.hive.ql.udf.UDFJson
Function type:BUILTIN

从执行结果来看,

  • get_json_object 有两个参数:json_txt, path
    json_txt:需要解析的json字符串数据。
    path:json中的 ‘路径’,
    其需要遵守如下的规则:
$   : Root object 表示根对象,即整个json
.   : Child operator 表示用.来关联子路径
[]  : Subscript operator for array 表示如果子路径为数组类型,需要用[]来获取数据
 *   : Wildcard for [] 表示使用[]的时候,支持通配符*
  • 函数类路径:org.apache.hadoop.hive.ql.udf.UDFJson

2. json_tuple函数

再看下json_tuple的

执行命令:

desc function extended json_tuple;

执行结果:

json_tuple(jsonStr, p1, p2, ..., pn) - like get_json_object, but it takes multiple names and return a tuple. All the input parameters and output column types are string.
Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDTFJSONTuple
Function type:BUILTIN

从执行结果来看:

  • json_tuple 可以传多个参数,jsonStr, p1, p2, …, pn,
    jsonStr:需要解析的json字符串数据。
    p1, p2, …, pn:json中的多个 ‘路径’
    返回一个元组,所有输入参数和输出列的数据为sting类型。
  • 函数类路径:org.apache.hadoop.hive.ql.udf.generic.GenericUDTFJSONTupl

二、解析简单json

给定如下测试数据:

{"id":1,"name":"zhangsan"}

1. 想要解析name,可以使用get_json_object:

select get_json_object('{"id":1,"name":"zhangsan"}', "$.name");

也可以使用json_tuple :

select json_tuple('{"id":1,"name":"zhangsan"}', "name");

2. 想同时提取所有字段,可以用json_tuple

select json_tuple('{"id":1,"name":"zhangsan"}', "id","name");

也可以使用get_json_object

select get_json_object('{"id":1,"name":"zhangsan"}', "$.id"),get_json_object('{"id":1,"name":"zhangsan"}', "$.name");

三、解析json数组

给定如下测试数组数据:

[{"id":1,"name":"zhangsan"},{"id":2,"name":"lisi"},{"id":3,"name":"wangwu"}]

1. 提取数组中第一条数据的name

select get_json_object('[{"id":1,"name":"zhangsan"},{"id":2,"name":"lisi"},{"id":3,"name":"wangwu"}]', "$.[0].name");
select get_json_object('[{"id":1,"name":"zhangsan"},{"id":2,"name":"lisi"},{"id":3,"name":"wangwu"}]', "$[0].name");

2. 提取数组中所有的name

select get_json_object('[{"id":1,"name":"zhangsan"},{"id":2,"name":"lisi"},{"id":3,"name":"wangwu"}]', "$.[*].name");
select get_json_object('[{"id":1,"name":"zhangsan"},{"id":2,"name":"lisi"},{"id":3,"name":"wangwu"}]', "$[*].name");

四、解析嵌套json

给定如下测试嵌套json数据:

{"class":[{"id":1,"name":"zhangsan"},{"id":2,"name":"lisi"},{"id":3,"name":"wangwu"}]}

1. 提取class字段下数组

select get_json_object('{"class":[{"id":1,"name":"zhangsan"},{"id":2,"name":"lisi"},{"id":3,"name":"wangwu"}]}', "$.class");

2. 提取class字段下数组的name

select get_json_object('{"class":[{"id":1,"name":"zhangsan"},{"id":2,"name":"lisi"},{"id":3,"name":"wangwu"}]}', "$.class[*].name");
select get_json_object('{"class":[{"id":1,"name":"zhangsan"},{"id":2,"name":"lisi"},{"id":3,"name":"wangwu"}]}', "$.class.name");

注意:

Tez引擎是支持上面两种写法的,即"$.class[].name"和"$.class.name";
但是spark引擎只支持"$.class[
].name"写法,而不支持"$.class.name",不然就会解析成null!

这个也是前文提到的结果为null的原因!

总结

最后还是提醒小伙伴们,在开发过程中,一定要注意sql语法格式的书写,避免一些意想不到的结果!

相关文章
|
6月前
|
SQL 存储 分布式计算
Hive数据仓库设计与优化策略:面试经验与必备知识点解析
本文深入探讨了Hive数据仓库设计原则(分区、分桶、存储格式选择)与优化策略(SQL优化、内置优化器、统计信息、配置参数调整),并分享了面试经验及常见问题,如Hive与RDBMS的区别、实际项目应用和与其他组件的集成。通过代码样例,帮助读者掌握Hive核心技术,为面试做好充分准备。
533 0
|
6月前
|
SQL 存储 NoSQL
实时计算 Flink版产品使用合集之使用ParameterTool.fromArgs(args)解析参数为null,该怎么处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
SQL 数据采集 存储
NULL 值与零或空格相同吗?详尽解析
【8月更文挑战第31天】
241 0
|
5月前
|
SQL 缓存 关系型数据库
ClickHouse(19)ClickHouse集成Hive表引擎详细解析
Hive引擎允许对HDFS Hive表执行 `SELECT` 查询。目前它支持如下输入格式: -文本:只支持简单的标量列类型,除了 `Binary` - ORC:支持简单的标量列类型,除了`char`; 只支持 `array` 这样的复杂类型 - Parquet:支持所有简单标量列类型;只支持 `array` 这样的复杂类型
203 1
|
6月前
|
存储 算法 Java
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
【5月更文挑战第17天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
52 2
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
|
5月前
|
Java
【Java】Object类简单解析
【Java】Object类简单解析
63 1
|
5月前
|
SQL 关系型数据库 MySQL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
276 0
|
6月前
|
SQL 存储 JSON
Hive 解析 JSON 字符串数据的实现方式
Hive 提供 `get_json_object` 函数解析 JSON 字符串,如 `{"database":"maxwell"}`。`path` 参数使用 `$`、`.`、`[]` 和 `*` 来提取数据。示例中展示了如何解析复杂 JSON 并存储到表中。此外,Hive 3.0.0及以上版本内置 `JsonSerDe` 支持直接处理 JSON 文件,无需手动解析。创建表时指定 `JsonSerDe` 序列化器,并在 HDFS 上存放 JSON 文件,可以直接查询字段内容,方便快捷。
344 3
|
6月前
|
JSON PHP 数据格式
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
|
6月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

推荐镜像

更多