SQL之一天一个小技巧:如何使用HQL提取JSON中 key值

103 篇文章 222 订阅
98 篇文章 119 订阅

目录

0 问题描述

1 问题解决

2 小结


0 问题描述

如下json_str

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

 我想获取该json中的每一个key值,如何做?

1 问题解决

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

利用translate()函数处理

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

欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值