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

news2024/10/7 8:20:37

一、目的

用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(
select
       get_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)
select
        t1.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字段解析成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1221377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAN总线负载及CANoe查看总线负载率

文章目录 一、什么是CAN总线的负载率?二、负载率计算三、CANoe查看总线负载率 一、什么是CAN总线的负载率? 一般业内对负载率的定义为:实际数据传输速率和理论上能达到的数据传输速率的比值。 传输速率一般是按秒来计算,数据传输…

Shell编程基础(3)- Shell的位置参数

Shell编程基础(3)- Shell的位置参数 Shell Scripting Essentials (3) – Locative Parameters of Shell Scripting 前文介绍过shell变量。当声明shell变量时,只需要在代码行写出变量名称即可;在输入行用read命令要求用户输入,在…

链表(一)----关于单链表的一切细节这里都有

一.链表 1 链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 现实中的链表结构 数据结构中的链表结构 1.链式结构在逻辑上是连续的,但在物理上不一定是…

数字化医学影像管理系统PACS源码

PACS系统,意为影像归档和通信系统。它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各…

数据库选型与优化:策略与技巧的探讨

大家好,我是一名狂热的数据库程序员,最近鼓起勇气开始吐槽一下数据库,如有雷同,请对号入座。 名不副实的数据库类型 先说说最近的事,我们业务有很多图片要管理,老板说让我选个专业的图数据库,…

Leetcode—3.无重复字符的最长子串【中等】

2023每日刷题&#xff08;三十二&#xff09; Leetcode—3.无重复字符的最长子串 实现代码 class Solution { public:int lengthOfLongestSubstring(string s) {unordered_set<char> smap;int maxlen 0;int left 0;for(int i 0; i < s.size(); i) {while(smap.fi…

QT绘图设备

pixmap绘图设备在磁盘上进行绘图 通过pix.save将图片保存到E盘下 不是主要的绘画设备&#xff0c;可以将绘图指令保存 然后在下边可以调用重现绘图指令

Pikachu漏洞练习平台之SSRF(服务器端请求伪造)

注意区分CSRF和SSRF&#xff1a; CSRF&#xff1a;跨站请求伪造攻击&#xff0c;由客户端发起&#xff1b; SSRF&#xff1a;是服务器端请求伪造&#xff0c;由服务器发起。 SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&#xff0c;但又没有对目标…

跨境电商测评新方案,安全可靠,高成功率

不管是做测评服务商还是卖家想给自己做测评&#xff0c;是否都为了如何搭建一个安全可靠的测评环境而苦恼呢&#xff1f;不知道如何搭建高成功率的真实安全买家环境苦恼&#xff1f;陈哥带你了解一种全新的解决方案&#xff0c;能够让你们的测评工作更加高效、安全、可靠&#…

简单介绍二分类问题评价指标

正确率(Accuracy) Accuracy ​(TP TN)/(TP TN FP FN)精准率(Precision) 记忆&#xff1a;在识别出某标签中正确的比例&#xff1b; 比如识别为某标签的一共有105个&#xff0c;其中有95个是识别对的&#xff0c;那Precision就是95/105&#xff1b; TP/(TPFP)召回率(Recall…

NJU操作系统公开课笔记(1)

目录 一.计算机系统概述 二.计算机硬件系统 三.计算机软件系统 四.计算机操作技术的发展 五.计算机OS 1.资源管理的角度 2. 程序控制的角度 3.OS控制计算机的角度 4.人机交互的角度 5.程序接口的角度 6.系统结构的角度 单道批处理系统 多道批处理系统 分时系统 …

Git 基本操作

目录 创建仓库命令 git init git clone 提交与修改 git add git status git diff git commit git reset git rm git mv git checkout git switch git restore 提交日志 git log git blame 远程操作 git remote git fetch git pull git push Git 的工作就…

Elasticsearch搜索分析引擎本地部署与远程访问

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜索和分析引擎&#xff0c;它提供了一个分布式、多…

深度学习(五)softmax 回归之:分类算法介绍,如何加载 Fashion-MINIST 数据集

Softmax 回归 基本原理 回归和分类&#xff0c;是两种深度学习常用方法。回归是对连续的预测&#xff08;比如我预测根据过去开奖列表下次双色球号&#xff09;&#xff0c;分类是预测离散的类别&#xff08;手写语音识别&#xff0c;图片识别&#xff09;。 现在我们已经对回…

Kafka学习笔记(三)

目录 第5章 Kafka监控&#xff08;Kafka Eagle&#xff09;5.2 修改kafka启动命令5.2 上传压缩包5.3 解压到本地5.4 进入刚才解压的目录5.5 将kafka-eagle-web-1.3.7-bin.tar.gz解压至/opt/module5.6 修改名称5.7 给启动文件执行权限5.8 修改配置文件5.9 添加环境变量5.10 启动…

【Proteus仿真】【51单片机】公交车报站系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD12864显示模块、DS18B20温度传感器、DS1302时钟模块、按键、LED蜂鸣器、ULN2003、28BYJ48步进电机模块等。 主要功能&#xff1a; 系统运行后&…

Linux基础知识(1)——目录结构,绝对/相对路径,指令等(配图)

目录 1.目录结构 2.路径 3.认识指令 文章内容并不聚焦于Linux命令&#xff0c;而是针对Linux的基础知识进行讲解&#xff0c;相信这部分知识更能帮助大家了解Linux系统。 本文只是带大家简单了解一下Linux的入门知识&#xff0c;在之后的文章中&#xff0c;我们将讲解Linux中…

【图数据库实战】HugeGraph架构

一、概述 作为一款通用的图数据库产品&#xff0c;HugeGraph需具备图数据的基本功能&#xff0c;如下图所示。HugeGraph包括三个层次的功能&#xff0c;分别是存储层、计算层和用户接口层。 HugeGraph支持OLTP和OLAP两种图计算类型&#xff0c;其中OLTP实现了Apache TinkerPop3…

C语言指针详解(1)(能看懂字就能明白系列)文章超长,慢慢品尝

目录 1、内存和地址 2、指针简介 与指针相关的运算符&#xff1a; 取地址操作符&#xff08;&&#xff09; 解引用操作符&#xff08;间接操作符&#xff09;&#xff08;*&#xff09; ​编辑 指针变量的声明 指针变量类型的意义 指针的基本操作 1、指针与整数相加…

解决 uniapp 开发微信小程序 不能使用本地图片作为背景图 问题

参考博文&#xff1a;uniapp微信小程序无法使用本地静态资源图片(背景图在真机不显示)的解决方法_javascript技巧_脚本之家 问题&#xff1a;uniapp 开发微信小程序&#xff0c;当使用本地图片作为 background-image 时&#xff0c;真机无法显示 解决&#xff1a; 方法一&am…