hive 中 统计某字段json数组中每个value出现的次数

有这样一个json串

{"viewdata":[{"city_id":"59","position_id":0,"qd_title":"网红打卡地","list_id":35},{"city_id":"59","position_id":1,"qd_title":"看青山游绿水","list_id":37}]}

需要将json数组里的qd_title都提取出来转换成hive中的array数组。下面介绍两种方法

法一get_json_object+正则

1.首先可以使用get_json_object函数,提取出数组,但是这个返回的是一个字符串

select get_json_object('{"viewdata":[{"city_id":"39","position_id":0,"qd_title":"网红打卡地","list_id":135},
{"city_id":"39","position_id":1,"qd_title":"看青山游绿水","list_id":327}]}',
'$.viewdata[*].qd_title')

-- 返回,注意这不是一个array数组,只是一个字符串
["网红打卡地","看青山游绿水"]

2.将字符串中的[ ] "都去掉,形成一个,分割的字符串

regexp_replace('${刚刚得到的字符串}','(\\[|\\]|")','')

3.使用字符串分割函数split

select 
split(
   regexp_replace(
      get_json_object('{"viewdata":[{"city_id":"39","position_id":0,"qd_title":"网红打      卡地","list_id":135},
      {"city_id":"39","position_id":1,"qd_title":"看青山游绿水","list_id":327}]}',
      '$.viewdata[*].qd_title'),
   '(\\[|\\]|")',''),
",")

4.整体使用LATERAL VIEW 打平数组进行统计

SELECT qdtitle,COUNT(DISTINCT uuid) uv
  FROM ba_travel.bas_log_sdk_mt_mv a LATERAL VIEW explode(split(regexp_replace(get_json_object(a.event_attribute['custom'],'$.viewdata[*].qd_title'),'(\\[|\\]|")',''),",")) b AS qdtitle
 GROUP BY qdtitle

法二 正则匹配

1.观察json数组中每一个元素都是由{}保卫,由,分割,所以可以使用``},```对字符串进行拆分

-- event_attribute['custom'] 对应的就是上面的json字符串
split(event_attribute['custom'],'"}')

2.对分割出来的每一个元素进行正则匹配,提取出qd_title对应的value

-- qd_titles 为上面分割出数组的一个元素
regexp_extract(qd_titles,'qd_title...([^"]+)',1)

3.整体使用later view 将数组打平

SELECT regexp_extract(qd_titles,'qd_title...([^"]+)',1) title,
       COUNT(DISTINCT uuid) uv
  FROM ba_travel.bas_log_sdk_mt_mv a LATERAL VIEW  explode(split(event_attribute['custom'],'"}')) b as qd_titles 
 GROUP BY regexp_extract(qd_titles,'qd_title...([^"]+)',1)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT技术精选文摘

10分钟让你明白MySQL是如何利用索引的

一、前言 在MySQL中进行SQL优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑。 譬如: MySQL 在遇到范围查询条件的时候就停止匹配了...

25670
来自专栏醉生梦死

MySQL常用函数 原

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()));

14120
来自专栏xiaoxi666的专栏

Mybatis foreach标签含义

这种方式非常方便,我们只要把查询条件写出来,剩下的操作都由mysql来处理。而在实际场景中,为了减少底层耦合,我们一般不通过mysql中的子查询方式联表查询,而...

22810
来自专栏idba

order by 原理以及优化

一 简介 偏向于业务的(MySQL)DBA或者业务的开发者来说,order by 排序是一个常见的业务功能,将结果根据指定的字段排序,满足前端展示的需求。然而...

14430
来自专栏Python爬虫与算法进阶

Spark实战--学习UDF

UDF全称User-Defined Functions,用户自定义函数,是Spark SQL的一项功能,用于定义新的基于列的函数,这些函数扩展了Spark SQ...

21310
来自专栏Java学习123

mysql分组查询

34890
来自专栏互联网开发者交流社区

Oracle-函数大全

24850
来自专栏JavaEE

mybatis笔记整理mybatis的基本用法及配置:

430110
来自专栏Python爬虫实战

MySQL 从零开始:07 数据搜索与搜索

数据库表中包含了很多数据,一般我们不会检索表中的所有行。通常会根据特定的条件来提取出表的子集,此时我们需要指定搜索条件(search criteria),搜索条...

12520
来自专栏Java帮帮-微信公众号-技术文章全总结

Oracle应用实战六——函数+集合

函数 字符函数 接收字符输入返回字符或者数值,dual是伪表 1. 把小写的字符转换成大小的字符 upper('smith') ? 2. 把大写字符变成小写字符...

31650

扫码关注云+社区

领取腾讯云代金券