当前位置: 首页 > news >正文

二百零二、Hive——Hive解析JSON字段(单个字段与json数组)

一、目的

用Flume采集Kafka写入到Hive的ODS层在HDFS路径下的JSON数据,需要在DWD层进行解析并清洗

(一)Hive的ODS层建静态分区外部表

create external table  if not exists  ods_queue(queue_json  string
)
comment '静态排队数据表——静态分区'
partitioned by (day string)
row format delimited fields terminated by '\x001'
lines terminated by '\n'
stored as SequenceFile
tblproperties("skip.header.line.count"="1");

(二)Flume将Kafka数据写入ODS层表在HDFS的路径下

(三)ODS层表数据样例

(四)ODS层表的JSON数据样例

JSON数据字段queue_json中除了单个字段如deviceNo外,还包括json数组queueList

{
  "deviceNo": "radar-1020",
  "createTime": "2023-10-16 10:18:55",
  "laneNum": 5,
  "queueList": [
    {
      "laneNo": 8,
      "queueLen": 28.0,
      "queueHead": 24.0,
      "queueTail": 23.0,
      "queueCount": 88
    },
    {
      "laneNo": 5,
      "queueLen": 12.0,
      "queueHead": 45.0,
      "queueTail": 2.0,
      "queueCount": 91
    },
    {
      "laneNo": 7,
      "queueLen": 79.0,
      "queueHead": 1.0,
      "queueTail": 78.0,
      "queueCount": 71
    },
    {
      "laneNo": 7,
      "queueLen": 87.0,
      "queueHead": 99.0,
      "queueTail": 38.0,
      "queueCount": 42
    },
    {
      "laneNo": 14,
      "queueLen": 51.0,
      "queueHead": 41.0,
      "queueTail": 52.0,
      "queueCount": 36
    },
    {
      "laneNo": 1,
      "queueLen": 10.0,
      "queueHead": 81.0,
      "queueTail": 27.0,
      "queueCount": 57
    },
    {
      "laneNo": 5,
      "queueLen": 40.0,
      "queueHead": 81.0,
      "queueTail": 19.0,
      "queueCount": 42
    },
    {
      "laneNo": 5,
      "queueLen": 80.0,
      "queueHead": 96.0,
      "queueTail": 34.0,
      "queueCount": 100
    }
  ]
}

二、所需Hive函数介绍

除了用到get_json_object函数或json_tuple函数外,json数组还需要用到explode函数、regexp_replace函数以及lateral view函数

(一)get_json_object函数(解析json字段,不包含json数组

1、语法:get_json_object(string json_string, string path)

2、说明:解析 json 的字符串 json_string,返回 path 指定的内容。如果输入的 json 字符串无效,那么返回 NULL。

3、这个函数每次只能返回一个数据项。

4、SQL样例

select a.timestamp, get_json_object(a.appevents, '$.eventid'), get_json_object(a.appenvets, '$.eventname') from log a;

(二)json_tuple函数解析json字段,不包含json数组

1、语法:json_tuple(json_string, k1, k2 ...)

2、说明:解析json的字符串json_string,可指定多个json数据中的key,返回对应的value。如果输入的json字符串无效,那么返回NULL。

3、一次解析出多个数据项的函数

4、json_tuple函数不能加$.,否则会解析不到

5、SQL样例

select a.timestamp, b.*

from log a lateral view json_tuple(a.appevent, 'eventid''eventname') b as f1, f2;

(三)explode函数

1、语法:explode(Array OR Map)

2、说明:explode()函数接收一个array或者map类型的数据作为输入,然后将array或map里面的元素按照每行的形式输出,即将hive一列中复杂的array或者map结构拆分成多行显示,也被称为列转行函数。

(四)regexp_replace函数

1、语法: regexp_replace(string A, string B, string C)

2、说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。

(五)lateral view函数

1、说明

在用UDTF比如explode的时候,由于SELECT 只支持一个字段,因此需要lateral view函数!

lateral view函数一般用于和split、explode等UDTF一起使用的,它能将一行数据拆分成多行数据,在并此基础上可以对拆分的数据进行聚合。

2、SQL样例

select col_A,col_B,tmp_table.tmp_col 
from test_table 
lateral view explode(split(col_C,'分隔符')) tmp_table as tmp_col
where partition_name='xxx';

3、SQL样例说明

col_A,col_B,col_C: 都是原表 test_table 的列(字段);
tmp_table:explode形成的新虚拟表,可以不写;
tmp_col:explode 形成的新列(字段);

三、解析JSON数据的HiveSQL(包含json数组

(一)SQL语句

with t1 as(
selectget_json_object(queue_json,'$.deviceNo')   device_no,get_json_object(queue_json,'$.createTime') create_time,get_json_object(queue_json,'$.laneNum')    lane_num,get_json_object(queue_json,'$.queueList')  queue_list,
day
from hurys_dc_ods.ods_queue)
selectt1.device_no,t1.lane_num,t1.create_time,get_json_object(list_json,'$.laneNo')         lane_no,get_json_object(list_json,'$.queueCount')     queue_count,get_json_object(list_json,'$.queueLen')       queue_len,get_json_object(list_json,'$.queueHead')      queue_head,get_json_object(list_json,'$.queueTail')      queue_tail,date(t1.create_time) day
from t1
lateral view explode(split(regexp_replace(regexp_replace(queue_list,'\\[|\\]','') ,  --将json数组两边的中括号去掉'\\}\\,\\{','\\}\\;\\{'),  --将json数组元素之间的逗号换成分号'\\;') --以分号作为分隔符(split函数以分号作为分隔))list_queue as list_json
;

(二)HQL执行结果

json字段解析成功!

相关文章:

  • 第六章 图(上)【图的基本概念和存储】
  • IntelliJ IDE 插件开发 |(一)快速入门
  • 使用IDEA 将Eclipse java工程转为maven格式
  • 快速弄懂C++中的this指针
  • Android7.1 高通 特定apk最上面活动时,禁止关机或重启
  • 算法----小行星碰撞
  • 解决SSH连接自动断开的问题
  • [Vue 配置] Vite + Vue3 项目配置 Tailwind CSS
  • 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷
  • 人充当LLM Agent的工具(Human-In-The-Loop ),提升复杂问题解决成功率
  • STM32F429主控TB6612驱动直流电机----解决PWM波形未输出bug
  • 清华学霸告诉你:如何自学人工智能?
  • 【Python 千题 —— 基础篇】输出列表方差
  • 国产化项目改造:使用达梦数据库和东方通组件部署,前后端分离框架
  • mac中安装Homebrew
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Hibernate最全面试题
  • Java程序员幽默爆笑锦集
  • Laravel Mix运行时关于es2015报错解决方案
  • Python连接Oracle
  • 程序员该如何有效的找工作?
  • 从0到1:PostCSS 插件开发最佳实践
  • 基于HAProxy的高性能缓存服务器nuster
  • 讲清楚之javascript作用域
  • 悄悄地说一个bug
  • 什么是Javascript函数节流?
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 因为阿里,他们成了“杭漂”
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # Maven错误Error executing Maven
  • #在 README.md 中生成项目目录结构
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二)springcloud实战之config配置中心
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (九)c52学习之旅-定时器
  • (算法设计与分析)第一章算法概述-习题
  • (未解决)macOS matplotlib 中文是方框
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)项目管理杂谈-我所期望的新人
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .Net中wcf服务生成及调用
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • [1525]字符统计2 (哈希)SDUT
  • [20161214]如何确定dbid.txt