SQL进阶--5__如何使用hiveSQL提取JSON中 key值

本文详细介绍了如何通过HQL处理JSON字符串,提取其中的key值。首先利用translate()和regexp_replace()函数去除特殊字符并转换逗号,然后使用posexplode()展开并获取奇数行的key值,最终得到JSON对象的key。这种方法适用于处理包含多个键值对的JSON数据。
摘要由CSDN通过智能技术生成

如何使用HQL提取JSON中 key值

0-问题描述

如下json_str

json_str
[{“website”:“baidu.com”,“name”:“百度”},{“website”:“google.com”,“name”:“谷歌”}]

平时在工作中我们经常会处理json格式的数据串,通常是取json的value值,但是我想获取该json中的每一个key值,如何做,筒子们有遇到过这种需求吗?

1-问题解决

(1)先将json_str中的[]及{}去掉

此处利用translate()函数处理,(当然也可以使用regexp_repalce()处理。)

select translate('[{"website":"baidu.com","name":"百度"} ,{"website":"google.com","name":"谷歌"}]'
                  ,'[]{}""','') 

结果如下:

OK
website:baidu.com,name:百度,website:google.com,name:谷歌
Time taken: 1.335 seconds, Fetched: 1 row(s)

(2)将逗号替换成冒号:

select regexp_replace(translate('[{"website":"baidu.com","name":"百度"},{"website":"google.com","name":"谷歌"}]'
                  ,'[]{}""','') ,'\,','\:')

计算结果如下:

OK
website:baidu.com:name:百度:website:google.com:name:谷歌
Time taken: 0.165 seconds, Fetched: 1 row(s)

(3)将步骤2计算的结果用posexplode()函数展开,获取索引值及具体值

select pos+1 as rn
      ,val
from(
    select regexp_replace(translate('[{"website":"baidu.com","name":"百度"},{"website":"google.com","name":"谷歌"}]'
                      ,'[]{}""','') ,'\,','\:') as str
) t1 lateral view posexplode(split(str,':')) t2 as pos,val 

计算结果如下:

OK
1	website
2	baidu.com
3	name
4	百度
5	website
6	google.com
7	name
8	谷歌
Time taken: 0.224 seconds, Fetched: 8 row(s)

(4)由于K-V是一组对偶元组,因此K为奇数行,我们只需要取出奇数行的记录即可

select rn
      ,val as key
from(
    select pos+1 as rn
          ,val
    from(
        select regexp_replace(translate('[{"website":"baidu.com","name":"百度"},{"website":"google.com","name":"谷歌"}]'
                          ,'[]{}""','') ,'\,','\:') as str
    ) t1 lateral view posexplode(split(str,':')) t2 as pos,val
) m 
where rn%2=1 

计算结果如下:

OK
1	website
3	name
5	website
7	name
Time taken: 0.294 seconds, Fetched: 4 row(s)

2-总结

本文给出了一种通过HQL提取JSON中 key值的方法和技巧,主要使用的知识点如下:

  • (1)字符替换函数:translate()函数
  • (2)字符串替换函数:regexp_replace()函数
  • (3) 列转行:lateral view posexplode()函数
  • (4)获取奇数行记录:mod(rn,2)=1
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值