HIVE获取json字段特定值(单个json或者json数组)

1.获取单个json字符串里的某一特定值

函数:get_json_object(单个json,'$.要获取的字段')

示例:

代码:SELECT get_json_object('{"NAME":"张三","ID":"1"}','$.NAME') as name;

SELECT get_json_object('{"NAME":"张三","ID":"1"}','$.NAME');

运行结果:

2.获取json数组特定值

2.1假如只是想获取json数组中某特定字段的全部值,不需要分行

函数:get_json_object(单个json,'$[ 数组中的特定位置或者不写,不写就是整个数组中的某字段所有值].要获取的字段')

示例:

代码:SELECT get_json_object('[{"NAME":"张三","ID":"1"},{"NAME":"李四","ID":"2"}]','$[0].NAME');

SELECT get_json_object('[{"NAME":"张三","ID":"1"},{"NAME":"李四","ID":"2"}]','$[0].NAME');

运行结果:

示例:

代码:SELECT get_json_object('[{"NAME":"张三","ID":"1"},{"NAME":"李四","ID":"2"}]','$[].NAME');

SELECT get_json_object('[{"NAME":"张三","ID":"1"},{"NAME":"李四","ID":"2"}]','$[].NAME');

运行结果:

2.2假如只是想获取json数组中某特定字段的全部值,要分行

假如只想要将json数组分行,用explode()就行,但是只能展示json数组分出来的行,假如要解析出数组中每json的某一字段值,那么就要利用regexp_extract,regexp_replace,split将json数组进行处理,然后再结合lateral viewget_json_object进行分行取值

代码示例:

SELECT 
tab1.除了JSON数组外想要展示的字段
,GET_JSON_OBJECT(临时表名.列重命名,'$.想要获取的字段') as 字段重命名
FROM (
        SELECT 除了JSON数组外想要展示的字段 ,
        split
            (regexp_replace
                  (regexp_extract(JSON数组,'^\\[(.+)\\]$',1),--regexp_extract正则表达式解析函数
                            '\\}\\,\\{', '\\}\\|\\|\\{'),--regexp_replace替换
                            '\\|\\|') --split分割符
                            as str --处理json数组
        FROM 表名)
tab1
lateral view explode(tab1.str) 临时表名--随意取 as 列重命名--随意取;

案例:

数据示例:

表名:classdata

classdata
1[{"NAME":"张三","ID":"1"},{"NAME":"李四","ID":"2"},{"NAME":"王五","ID":"3"}]
2[{"NAME":"刘二","ID":"1"},{"NAME":"邓虎","ID":"2"}]

代码:

SELECT 
tab1.class
,GET_JSON_OBJECT(tmptab .json_str ,'$.NAME') as NAME--想要ID,这样写再加一列就好
FROM (
        SELECT class ,
        split(regexp_replace(regexp_extract(data,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|') as eq_json_str 
        FROM classdata)tab1
lateral view explode(tab1.eq_json_str ) tmptab as json_str ;

运行结果:

classNAME
1张三
1李四
1王五
2刘二
2邓虎

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值