0


HiveSQL:提取json串内容(含key为中文情况)——get_json_oject和json_tuple

提取json串中内容,json格式示例如下
在这里插入图片描述

方法(运行环境Hive)

get_json_object

select  json_data
  ,get_json_object(json_data,'$.price')as price -- 取第一层,get_json_object(json_data,'$.inquiry_params')as inquiry_params -- 取第一层,取本身也是个json串,get_json_object(json_data,'$.params.cateId')as cateId -- 取多层嵌套的,get_json_object(json_data,'$.inquiry_params.颜色')as color2 -- 中文名的 ,此方法失败from ods.ods_table1 a
where get_day='2024-08-10'

在这里插入图片描述
可以看到,当json中对应的key是中文时,使用get_json_object获取失败,改为使用json_tuple。

json_tuple

首先,先看下如果获取前3个内容,json_tuple和get_json_object的不同。

select  json_data
  ,get_json_object(json_data,'$.price')as price
  ,get_json_object(json_data,'$.inquiry_params')as inquiry_params
  ,get_json_object(json_data,'$.params.cateId')as cateId
  ,t1.text1
  ,t1.text2
  ,t1.text3
from ods.ods_table1 a
lateral view json_tuple(json_data,'price','inquiry_params','cateId') t1 as text1,text2,text3 
where get_day='2024-08-10'

在这里插入图片描述

从上述例子,发现json_tuple和get_json_object的一些不同

  1. 可以看到json_tuple一次可以取多个内容;
  2. json_tuple只能取到 第一层 ,取不到嵌套的里层的内容,表现为cateId为NULL(text3列)。

那么回过头来,看看我们要取“颜色”的问题:
因为要取的颜色是在嵌套在json_data的inquiry_parms里的,不是第一层,json_tuple不能直接取到,那么做个改动:把传入函数的json_data改为inquiry_parms,那么“颜色”就变成第一层了,这样使用json_tuple就可以取到了。
json_tuple只能取到 第一层。

select  brand,product_name,title,json_data
  ,get_json_object(json_data,'$.price')as price
  ,get_json_object(json_data,'$.inquiry_params')as inquiry_params
  ,get_json_object(json_data,'$.params.cateId')as cateId
  ,get_json_object(json_data,'$.inquiry_params.颜色')as color2
  -- 取中文key的内容,t1.color5
  ,t1.function5
  ,t1.rag5
from ods.ods_table1 a
lateral view json_tuple(get_json_object(json_data,'$.inquiry_params'),'颜色','功能性问题(可多选或不选)','容量') t1 as color5,function5,rag5 
-- 把get_json_object(json_data,'$.inquiry_params')作为整体传入json_tuple函数where get_day='2024-08-10'

在这里插入图片描述

标签: sql json 数据库

本文转载自: https://blog.csdn.net/qq_40178216/article/details/141297216
版权归原作者 大橙子酸柠檬 所有, 如有侵权,请联系我们删除。

“HiveSQL:提取json串内容(含key为中文情况)——get_json_oject和json_tuple”的评论:

还没有评论