【hive】HiveSQL中两个json解析函数的使用&json路径定位小工具

文章目录

关于json: https://blog.csdn.net/atwdy/article/details/124668815

1.HiveSQL中两个json解析函数

1)get_json_object

文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-get_json_object,该函数可以按照层级关系解析出任意层级的key,指定的key不存在时返回null,开发中注意对null值的处理。既可以处理json对象也可以解析json数组。 参数中相关符号的含义如下:
$:代表json的根对象,即传入的json本身。(对象{ },或对象数组{ }, { }, ...
.:父子层级关系
[]:用于指定对象数组中要解析对象的下标,起始0
*:通配符,用在[]中,表示取[]中所有对象。(通配符个人认为适用的场景为取同一层级所有对象的某个属性时,如果是取所有对象本身,那么直接不加[]也是一样的效果)

demo

sql 复制代码
-- 测试json
create temporary view test as
select 
'[
    {
		"name": "张三",
		"age": 20,
		"sport": ["篮球", "乒乓球"]
	},
	{
		"name": "李四",
		"age": 20,
		"sport": ["足球", "羽毛球"]
	}
]' as json_str;

-- 取根对象,也就是传入的json本身
-- [{"name":"张三","age":20,"sport":["篮球","乒乓球"]},{"name":"李四","age":20,"sport":["足球","羽毛球"]}]
select get_json_object(json_str, '$') from test;

-- 取根对象数组中的第一个对象:张三
-- {"name":"张三","age":20,"sport":["篮球","乒乓球"]}
select get_json_object(json_str, '$[0]') from test;

-- 取根数组中所有对象的年龄,返回值为数组形式的字符串,不去重,忽略null值
-- [20,20]
select get_json_object(json_str, '$[*].age') from test;

2)json_tuple

文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-json_tuple,该函数适用于对传入的json对象一次性解析多个key的场景,如果用get_json_object需要解析多次,该函数只需要解析一次。传入的key不存在时同样返回null。只能提取json根对象的属性key,不能用于提取嵌套json对象的属性或跨多个层级的属性。且只能解析json对象不能解析json数组。

和get_json_object不同的是,get_json_object是一个普通的UDF函数,返回的是一个值。而json_tuple是一个UDTF函数,返回的是一个表,所以开发中为了关联原表相关信息该函数一般需要和lateral view侧视图
https://blog.csdn.net/atwdy/article/details/137614216连用。

demo

sql 复制代码
-- 测试json
create temporary view test as
select '1' as id, '{"name": "张三", "age": 20, "sport": ["篮球", "乒乓球"]}' as info
union all
select '2' as id, '{"name": "李四", "age": 20, "sport": ["足球", "羽毛球"]}' as info;

select * from test;
sql 复制代码
select json_tuple(info, 'name', 'age', 'sport') from test;

lateral view 关联原表信息:

sql 复制代码
select 
    t1.id,
    t2.*
from test t1 
lateral view json_tuple(info, 'name', 'age', 'sport') t2 as name, age, sport;

官网中只说了需要通过lateral view关联原表信息,但实际测试中发现select id, json_tuple(info, 'name', 'age', 'sport') as (name, age, sport) from test;这种语法格式也能输出上图结果。虽然逻辑上理解并不矛盾,尽管该UDTF返回的是个表,但一行输入只会对应一行输出,只是输出的字段可能是多个,并不像explode那样返回的是多行。所以不会出现一行输入对应多行输出的情况。但官方文档中没有提到这种语法,为了准确还是按照侧视图实现比较稳妥。

2.json中key所在层级路径定位小工具

对于一个复杂的json串,解析某个key时人工查找该key所在路径效率低也容易出错,下面代码可以快速找到指定key第一次出现时所在的层级路径:

py 复制代码
#!/usr/bin/env python3
# -*-coding:utf-8 -*-
"""
@desc: 查找json中key第一次出现时的所在层级路径,key不存在返回None
@time: 2024/8/4 01:52
"""

import json


def find_path(json_obj, key, path=None):
    if path is None:
        path = []

    if isinstance(json_obj, dict):
        if key in json_obj:
            return path + [key]
        for k, v in json_obj.items():
            p = find_path(v, key, path + [k])
            if p is not None:
                return p
    elif isinstance(json_obj, list):
        for i, v in enumerate(json_obj):
            p = find_path(v, key, path + [str(i)])
            if p is not None:
                return p
    return None


if __name__ == '__main__':
    json_file = r'./data.json'
    with open(json_file, 'r', encoding='utf8') as fin:
        json_obj = json.load(fin)
        path = find_path(json_obj, key='broadcast_desc')
        print(path)
相关推荐
赵庆明老师21 小时前
Vben精讲:21-详解web-antd:tsconfig.json
前端·json·vim
红叶舞2 天前
成数据绑定对象,在应用程序中处理完数据后,将更新的数据序列化为JSON传回远端服务器,很多移动应用使用了这种模式处理服务器端的数据。 ...
运维·服务器·json
name好难取诶3 天前
解析请求体内容(如 JSON、表单数据、XML 等) 将原始数据转换为 Python 数据结构 使转换后的数据可在 request. ...
xml·python·json
gcw10243 天前
JSONMe 简觅JSON 工具
json·json格式化·json可视化·json美化·json校验·好用的json工具·json编辑
北北牌屈四巴格!3 天前
whistle自定义修改接口返回值内容
前端·json
SQDN4 天前
Chatbox 1.22.1 获取不到模型?先验 /models,再对齐精确 model ID
人工智能·测试工具·机器学习·chatgpt·json
SunnyDays10114 天前
Python 将 Excel(XLS/XLSX)转换为 JSON:导出工作簿、工作表、单元格区域与自定义 JSON 结构
python·json·excel·excel 转 json·导出 excel 到 json·xlsx 转 json·xls 转 json
刘小八4 天前
Spring AI 结构化输出:稳定生成可校验的业务 JSON
人工智能·spring·json
CodexDave5 天前
Python 自动化接单实战(一):把 CSV 需求做成配置驱动解析器
java·python·自动化·json·数据清洗·python自动化·csv处理
牛奶咖啡135 天前
大数据Hadoop运维应用实践——HIVE与Hadoop实现整合_Hive的配置安装与使用
大数据·hive·hive的配置与安装·metastore服务的配置·hiveserver2服务配置·hive的常用sql操作·beeline的使用