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

简介: 解决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语法格式的书写,避免一些意想不到的结果!

相关文章
|
10月前
|
JSON 缓存 自然语言处理
多语言实时数据微店商品详情API:技术实现与JSON数据解析指南
通过以上技术实现与解析指南,开发者可高效构建支持多语言的实时商品详情系统,满足全球化电商场景需求。
|
12月前
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
11月前
|
JSON 算法 API
淘宝商品评论API接口核心解析,json数据返回
淘宝商品评论API是淘宝开放平台提供的数据服务接口,允许开发者通过编程方式获取指定商品的用户评价数据,包括文字、图片、视频评论及评分等。其核心价值在于:
|
9月前
|
JSON Java Go
【GoGin】(2)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法
bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将,以方便后续业务逻辑的处理。
486 3
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
343 67
|
9月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
1239 0
|
10月前
|
JSON 自然语言处理 API
多语言实时数据淘宝商品评论API:技术实现与JSON数据解析指南
淘宝商品评论多语言实时采集需结合官方API与后处理技术实现。建议优先通过地域站点适配获取本地化评论,辅以机器翻译完成多语言转换。在合规前提下,企业可构建多语言评论数据库,支撑全球化市场分析与产品优化。
|
SQL 数据采集 数据挖掘
大数据行业应用之Hive数据分析航班线路相关的各项指标
大数据行业应用之Hive数据分析航班线路相关的各项指标
640 1
|
SQL 分布式计算 大数据
大数据新视界 --大数据大厂之Hive与大数据融合:构建强大数据仓库实战指南
本文深入介绍 Hive 与大数据融合构建强大数据仓库的实战指南。涵盖 Hive 简介、优势、安装配置、数据处理、性能优化及安全管理等内容,并通过互联网广告和物流行业案例分析,展示其实际应用。具有专业性、可操作性和参考价值。
大数据新视界 --大数据大厂之Hive与大数据融合:构建强大数据仓库实战指南
|
SQL 分布式计算 大数据
大数据处理平台Hive详解
【7月更文挑战第15天】Hive作为基于Hadoop的数据仓库工具,在大数据处理和分析领域发挥着重要作用。通过提供类SQL的查询语言,Hive降低了数据处理的门槛,使得具有SQL背景的开发者可以轻松地处理大规模数据。然而,Hive也存在查询延迟高、表达能力有限等缺点,需要在实际应用中根据具体场景和需求进行选择和优化。
1380 6

热门文章

最新文章

推荐镜像

更多
  • DNS