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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 解决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语法格式的书写,避免一些意想不到的结果!

相关文章
|
2月前
|
SQL 存储 JSON
SQL,解析 json
SQL,解析 json
80 8
|
3月前
|
JSON API 数据格式
requests库中json参数与data参数使用方法的深入解析
选择 `data`或 `json`取决于你的具体需求,以及服务器端期望接收的数据格式。
303 2
|
3月前
|
JSON 前端开发 JavaScript
解析JSON文件
解析JSON文件
152 9
|
2月前
|
JSON JavaScript API
商品详情数据接口解析返回的JSON数据(API接口整套流程)
商品详情数据接口解析返回的JSON数据是API接口使用中的一个重要环节,它涉及从发送请求到接收并处理响应的整个流程。以下是一个完整的API接口使用流程,包括如何解析返回的JSON数据:
|
7月前
|
SQL 数据采集 数据挖掘
大数据行业应用之Hive数据分析航班线路相关的各项指标
大数据行业应用之Hive数据分析航班线路相关的各项指标
211 1
|
7月前
|
SQL 存储 大数据
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
272 0
|
7月前
|
SQL 分布式计算 数据库
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
309 0
|
7月前
|
SQL 存储 分布式计算
【大数据技术Hadoop+Spark】Hive数据仓库架构、优缺点、数据模型介绍(图文解释 超详细)
【大数据技术Hadoop+Spark】Hive数据仓库架构、优缺点、数据模型介绍(图文解释 超详细)
1166 0
|
2月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
68 0
|
5月前
|
SQL 分布式计算 大数据
大数据处理平台Hive详解
【7月更文挑战第15天】Hive作为基于Hadoop的数据仓库工具,在大数据处理和分析领域发挥着重要作用。通过提供类SQL的查询语言,Hive降低了数据处理的门槛,使得具有SQL背景的开发者可以轻松地处理大规模数据。然而,Hive也存在查询延迟高、表达能力有限等缺点,需要在实际应用中根据具体场景和需求进行选择和优化。

推荐镜像

更多