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

简介: get_json_object解析json

前言

最近一位开发的同学在使用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语法格式的书写,避免一些意想不到的结果!

相关文章
|
消息中间件 缓存 监控
Flink背压原理以及解决优化
Flink背压原理以及解决优化
1513 0
|
7月前
|
SQL 存储 数据管理
七、深入 Hive DDL:管理表、分区与洞察元数据
在日常使用 Hive 的过程中,我们不仅要会建表,更要学会灵活地维护和管理已有的数据结构。从添加字段到修改分区,从查看元数据到删除表或清空数据,掌握这些 DDL 操作和常用的 SHOW 命令,就像掌握了一套管理数据仓库的“万能钥匙”。这次将带你一步步熟悉这些命令的用法和实际应用场景,配合清晰的语法示例与练习题,帮助你更轻松地驾驭 Hive 数据管理的日常工作。
1201 6
|
SQL JSON 数据处理
大数据Hive JSON数据处理
大数据Hive JSON数据处理
1428 0
|
SQL 存储 JSON
Hive 解析 JSON 字符串数据的实现方式
Hive 提供 `get_json_object` 函数解析 JSON 字符串,如 `{"database":"maxwell"}`。`path` 参数使用 `$`、`.`、`[]` 和 `*` 来提取数据。示例中展示了如何解析复杂 JSON 并存储到表中。此外,Hive 3.0.0及以上版本内置 `JsonSerDe` 支持直接处理 JSON 文件,无需手动解析。创建表时指定 `JsonSerDe` 序列化器,并在 HDFS 上存放 JSON 文件,可以直接查询字段内容,方便快捷。
1984 3
|
JSON 数据格式
Hive----get_json_object() 函数
get_json_object() 函数
3979 0
|
SQL JSON 分布式计算
hive get_json_object解析json结果为null咋办?
解决get_json_object解析json结果为null的问题
1576 0
|
SQL JavaScript 前端开发
Hive学习-lateral view 、explode、reflect和窗口函数
Hive学习-lateral view 、explode、reflect和窗口函数
1137 4
|
SQL 数据处理 HIVE
【Hive】写出Hive中split、coalesce及collect_list函数的用法?
【4月更文挑战第17天】【Hive】写出Hive中split、coalesce及collect_list函数的用法?
|
SQL HIVE
Hive中日期处理函数的使用(date_format、date_add、date_sub、next_day)
Hive中日期处理函数的使用(date_format、date_add、date_sub、next_day)
4988 3
|
SQL 存储 Java
Hive 特殊的数据类型 Array、Map、Struct
在Hive中,`Array`、`Map`和`Struct`是三种特殊的数据类型。`Array`用于存储相同类型的列表,如`select array(1, "1", 2, 3, 4, 5)`会产生一个整数数组。`Map`是键值对集合,键值类型需一致,如`select map(1, 2, 3, "4")`会产生一个整数到整数的映射。`Struct`表示结构体,有固定数量和类型的字段,如`select struct(1, 2, 3, 4)`创建一个无名结构体。这些类型支持嵌套使用,允许更复杂的结构数据存储。例如,可以创建一个包含用户结构体的数组来存储多用户信息
4013 0