SQL专项练习第六天
Hive 在处理不同数据需求时的灵活性和强大功能,包括间隔连续问题的处理、行列转换、交易数据查询、用户登录统计以及专利数据分析等方面。本文将介绍五个 Hive 数据处理问题的解决方案,并通过实际案例进行演示。
先在home文件夹下建一个hivedata文件夹,把我们所需的数据写成txt文件导入到/home/hivedata/文件夹下面。
一、间隔连续问题
问题描述:给定一个游戏公司记录的用户每日登录数据表,要求计算每个用户最大的连续登录天数,可以间隔一天。
解决方案:
- 使用窗口函数
lead
获取每个用户下一次登录的日期,并计算与当前登录日期的天数差。 - 通过条件判断,如果天数差大于 2,则视为中断,否则继续累计连续登录天数。
- 使用窗口函数
sum
和条件判断,为连续登录的记录分配一个组 ID。 - 最后计算每个用户每个组的连续登录天数,并取最大值作为该用户的最大连续登录天数。
数据:
id dt
1001 2021-12-12
1002 2021-12-12
1001 2021-12-13
1001 2021-12-14
1001 2021-12-16
1002 2021-12-16
1001 2021-12-19
1002 2021-12-17
1001 2021-12-20
建表:
-- 建表
create table games_login_data(id int,dt string
)row format delimited
fields terminated by ' '
tblproperties("skip.header.line.count"="1");-- 导入数据
load data local inpath '/home/hivedata/games_login_data.txt'overwrite into table games_login_data;
代码如下:
with t as (select *,lead(dt,1,dt) over (partition by id order by dt ) next_dt,if(datediff(lead(dt, 1, dt) over (partition by id order by dt ), dt) > 2, null,datediff(lead(dt, 1, dt) over (partition by id order by dt ), dt))daysfrom games_login_data
),t2 as (select *,sum(if(days <=2 ,0,1)) over (partition by id order by dt) groupId from t
),t3 as (select id,sum(days)+1 activeDays from t2 group by id,groupId
)
select id,max(activeDays) from t3 group by id;
二、行列转换
问题描述:有一个表记录了各年份各部门的平均绩效考核成绩,要求进行行列转换。
解决方案:
- 使用
case when
语句和聚合函数,按照年份进行分组,对不同部门的绩效得分进行条件判断并聚合。 - 通过
case when
语句将部门作为列名,绩效得分作为对应的值,实现行转列的效果。
数据:
t1.a t1.b t1.c
2014 B 9
2015 A 8
2014 A 10
2015 B 7
建表:
-- 建表
create table t25(a string,b string,c int
)row format delimited
fields terminated by ',';
-- 导入数据
load data local inpath '/home/hivedata/t25.txt' into table t25;
代码如下:
1)多行转多列
-- 多行转多列
select a,max(case when b='A' then c else 0 end) col_A,max(case when b='B' then c else 0 end) col_B
from t25
group by a;
2)将结果转换为源表(多列转多行)
-- 结果表
create table t25_1 asselect a,max(case when b='A' then c else 0 end) col_A,max(case when b='B' then c else 0 end) col_Bfrom t25group by a;
-- 查询
select * from t25_1;
-- 多列转多行
select a, 'A' b, col_A c from t25_1
union all
select a, 'B' b, col_B c from t25_1;
3)多个绩效求多行转多列
-- 建表
create table t26(a string,b string,c int
)row format delimited
fields terminated by ',';
-- 导入数据
load data local inpath '/home/hivedata/t26.txt' into table t26;
-- 查询
select * from t26;
-- 多个绩效求多行转多列
select a,concat_ws(',', collect_list(case when b='A' then cast(c as string) end)) col_A,concat_ws(',', collect_list(case when b='B' then cast(c as string) end)) col_B
from t26
group by a;
三、交易表查询
建表:
create table transactions(user_id int,order_id int,pay_time string,order_amount decimal(10, 2)
)row format delimited
fields terminated by ',';
-- 导入数据 数据为AI生成
load data local inpath '/home/hivedata/transactions.txt' overwrite into table transactions;
查询过去一个月付款用户量最高的三天:
- 使用
date_format
函数将付款时间转换为日期格式。 - 使用
count(distinct)
统计每天不同的付款用户数量。 - 使用
where
子句筛选出过去一个月的付款记录。 - 按照付款用户数量降序排序,取前三天的记录。
代码如下:
方法一
-- 方法一
select to_date(pay_time), count(user_id) from transactions
where to_date(pay_time) >= date_sub(current_date(), 30)
group by to_date(pay_time)
order by count(user_id) desc
limit 3;
方法二
-- 方法二
with t as (select to_date(pay_time) days, count(user_id) countOrder from transactionswhere to_date(pay_time) >= date_sub(current_date(), 30)group by to_date(pay_time)
)select days, countOrder from t
order by countOrder desc limit 3;
查询昨天每个用户最后付款的订单 ID 及金额:
- 使用窗口函数
row_number
按照用户 ID 和付款时间降序排序,为每个用户的付款记录分配一个序号。 - 使用
where
子句筛选出昨天的付款记录。 - 选择序号为 1 的记录,即每个用户昨天最后付款的记录。
代码如下:
select user_id, order_id, order_amount, pay_time from (select user_id, order_id, order_amount, pay_time, row_number() over (partition by user_id order by to_date(pay_time) desc ) as rnfrom transactionswhere to_date(pay_time) = date_sub(current_date(), 1)) t
where rn = 1;
四、近 30 天每天平均登录用户数量
问题描述:给定一个用户登录日志表,要求查询近 30 天每天平均登录用户数量。
解决方案:
- 使用
date_format
函数将登录时间转换为日期格式。 - 使用
count(distinct)
统计每天不同的登录用户数量。 - 使用
where
子句筛选出近 30 天的登录记录。 - 对每天的登录用户数量进行平均计算。
建表:
-- 建表
create table user_logs(user_id int,log_id int,session_id string,visit_time string
)row format delimited
fields terminated by ',';-- 导入数据 数据为AI生成
load data local inpath '/home/hivedata/user_logs.txt' overwrite into table user_logs;
代码如下:
select avg(userNum) as `每天平均登录用户数量`
from(select to_date(visit_time), count(distinct user_id) userNum from user_logs
where to_date(visit_time) >= date_sub(current_date(), 30)
group by to_date(visit_time)) as t;
五、各类型专利 top 10 申请人及专利申请数
问题描述:给定一个专利明细表,要求查询各类型专利 top 10 申请人以及对应的专利申请数。
1)表名:t_patent_detail (专利明细表)
2)表字段:专利号(patent_id)、专利名称(patent_name)、专利类型(patent_type)、申请时间
(aplly_date)、授权时间(authorize_date)、申请人(apply_users)
3)说明:同一个专利,可以有1到多个申请人,多人之间按分号隔开。
4)请写出hive查询语句,各类型专利top 10申请人,以及对应的专利申请数
解决方案:
-
首先使用
lateral view explode
函数将申请人字段拆分成多行。 -
然后按照申请人进行分组,统计每个申请人的专利申请数。
-
使用窗口函数
rank
按照专利申请数降序排序,为每个申请人分配一个排名。 -
最后选择排名在前 10 的申请人及其专利申请数。
建表:
-- 建表
create table t_patent_detail(patent_id string,patent_name string,patent_type string,apply_date string,authorize_date string,apply_users string
)row format delimited
fields terminated by '\t'
tblproperties("skip.header.line.count"="1");-- 导入数据
load data local inpath '/home/hivedata/t_patent_detail.txt' overwrite into table t_patent_detail;
代码如下:
方法一
-
使用
lateral view explode
函数将apply_users
字段拆分成多行,每个申请人成为一条独立的记录。 -
按
patent_type
(专利类型)和apply_user
(申请人)进行分组,统计每个申请人的专利申请数。 -
最后按照专利类型和申请数降序排序。
-- 方法一
select patent_type, apply_user, count(*) as application_count
from (select patent_type, apply_user from t_patent_detaillateral view explode(split(apply_users, ';')) t1 as apply_user
) t2
group by patent_type, apply_user
order by patent_type, application_count desc ;
方法二
与方法一类似,先使用lateral view explode
函数拆分申请人字段,然后按专利类型和申请人分组统计申请数,最后排序。
with t as (select patent_type, apply_user from t_patent_detaillateral view explode(split(apply_users, ';')) t1 as apply_user
) select patent_type, apply_user, count(*) as application_count
from t group by patent_type, apply_user
order by patent_type, application_count desc ;
方法三
-
首先同样使用
lateral view explode
函数拆分申请人字段,得到中间表t2
。 -
对
t2
按专利类型和申请人分组,统计申请数,并使用窗口函数row_number()
按照申请数降序为每个专利类型内的申请人分配排名。 -
筛选出排名小于等于 10 的记录,即每个专利类型的 top 10 申请人。
-
最后按照专利类型和申请数降序排序。
select patent_type, apply_user, application_count
from (select patent_type, apply_user, count(*) as application_count,row_number() over (partition by patent_type order by count(*) desc ) as rankfrom (select patent_type, apply_user from t_patent_detaillateral view explode(split(apply_users, ';')) t1 as apply_user) t2group by patent_type, apply_user) t3 where t3.rank <=10
order by patent_type, application_count desc ;
方法四
与方法三类似,使用临时表和窗口函数来筛选出每个专利类型的 top 10 申请人,并进行排序。
with t as (select patent_type, apply_user from t_patent_detaillateral view explode(split(apply_users, ';')) t1 as apply_user
), t2 as (select patent_type, apply_user, count(*) as application_count,row_number() over (partition by patent_type order by count(*) desc ) as rankfrom t group by patent_type, apply_user
) select patent_type, apply_user, application_count
from t2 where t2.rank <= 10
order by patent_type, application_count desc ;
这四种方法都可以实现查询各类型专利 top 10 申请人及专利申请数的需求,但在性能和可读性上可能会有所不同。可以根据实际数据量和查询需求选择合适的方法。
六、总结
通过以上问题的解决,展示了 Hive 在处理不同数据需求时的灵活性和强大功能,包括间隔连续问题的处理、行列转换、交易数据查询、用户登录统计以及专利数据分析等方面。
相关文章:

SQL专项练习第六天
Hive 在处理不同数据需求时的灵活性和强大功能,包括间隔连续问题的处理、行列转换、交易数据查询、用户登录统计以及专利数据分析等方面。本文将介绍五个 Hive 数据处理问题的解决方案,并通过实际案例进行演示。 先在home文件夹下建一个hivedata文件夹&a…...

CSS——属性值计算
CSS——属性值计算 今天来详细讲解一下 CSS的属性值计算过程,这是 CSS 的核心之一(另一个是视觉可视化模型,个人理解,这个相对复杂,以后再讲)。 基本概念 层叠样式表:Cascade Style Sheet&am…...
408算法题leetcode--第26天
496. 下一个更大元素 I 题目地址:496. 下一个更大元素 I - 力扣(LeetCode) 题解思路:单调栈,如注释 时间复杂度:O(n m) 空间复杂度:O(n) 代码: class Solution { public:vector<int&g…...
JavaScript 与浏览器存储
JavaScript提供了两种存储数据的方式:LocalStorage和SessionStorage。这两种方式都是浏览器提供的客户端存储解决方案,可以将数据保存在用户的浏览器中,供网站使用。 LocalStorage和SessionStorage的区别在于数据的作用域和生命周期。 Loca…...

Chromium 如何查找已经定义好的mojom函数实现c++
进程通信定义通常都是用.mojom文件或者idl文件格式 以content\common\frame.mojom里面的BeginNavigation函数为例。 一、如何查找BeginNavigation函数定义,在vscode里面直接搜索BeginNavigation,过滤条件 *.idl,*.mojom,*.cc 效果: 这样…...

图文深入理解Oracle DB Scheduler(续)-调度的创建
List item 今天是国庆假期最后一天。窗外,秋雨淅淅沥沥淅淅下个不停。继续深宅家中,闲来无事,就多写几篇博文。 本篇承接前一篇,继续图文深入介绍Oracle DB Scheduler。本篇主要介绍调度的创建。 1. 创建基于时间的作业 • 可以…...

基于Springboot的宠物咖啡馆平台的设计与实现(源码+定制+参考)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

Conda答疑
文章目录 优雅的使用Conda管理python环境1. conda info -e 和conda env list区别2.conda创建环境 创建的新环境在哪个文件夹下3. 自定义路径4. anaconda 新建环境 包是来自哪里4.1. 默认 Anaconda 仓库4.2. Conda-Forge4.3. 镜像源4.4. 自定义频道4.5. 总结 5. conda config --…...

Python 工具库每日推荐【PyPDF2】
文章目录 引言Python PDF 处理库的重要性今日推荐:PyPDF2 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:PDF文件合并案例分析高级特性加密和解密PDF添加水印扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式 专栏…...
Nacos的应用
什么是nacos? Nacos是一个开源的动态服务发现,配置管理和服务治理平台。主要用于构建原生应用和微服务架构。它是阿里巴巴开源的项目,整合了配置管理,服务管理,服务发现的功能,核心价值在于帮助用户在云平…...

CSS圆角
在制作网页的过程中,有时我们可能需要实现圆角的效果,以前的做法是通过切图(将设计稿切成便于制作成页面的图片),使用多个背景图像来实现圆角。在 CSS3 出现之后就不需要这么麻烦了,CSS3 中提供了一系列属性…...

信息安全工程师(37)防火墙概述
前言 防火墙是一种网络安全系统,旨在监控和控制网络流量,根据预定义的安全规则决定是否允许数据包的传输。 一、定义与功能 定义:防火墙是网络安全的第一道防线,由硬件设备和软件系统共同构成,位于外网与内网之间、公共…...

多元化网络团队应对复杂威胁
GenAI、ML 和 IoT 等技术为威胁者提供了新的工具,使他们更容易针对消费者和组织发起攻击。 从诱骗受害者陷入投资骗局的Savvy Seahorse ,到使用 ChatGPT 之类的程序感染计算机并阅读电子邮件的自我复制 AI 蠕虫,新的网络威胁几乎每天都在出现…...
Observer(观察者模式)
1. 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 在观察者模式中,有两类对象:被观察者(Subject)和观察者(Observer…...

Python深度学习进阶与前沿应用:注意力机制、Transformer模型、生成式模型、目标检测算法、图神经网络、强化学习等
近年来,伴随着以卷积神经网络(CNN)为代表的深度学习的快速发展,人工智能迈入了第三次发展浪潮,AI技术在各个领域中的应用越来越广泛。为了帮助广大学员更加深入地学习人工智能领域最近3-5年的新理论与新技术࿰…...
24.1 prometheus-exporter管理
本节重点介绍 : exporter 流派 必须和探测对象部署在一起的1对多的远端探针模式 exporter管控的难点 1对1 的exporter 需要依托诸如 ansible等节点管理工具 ,所以应该尽量的少 1对1的exporter改造成探针型的通用思路 exporter 流派 必须和探测对象部署在一起的…...

【Arduino IDE安装】Arduino IDE的简介和安装详情
目录 🌞1. Arduino IDE概述 🌞2. Arduino IDE安装详情 🌍2.1 获取安装包 🌍2.2 安装详情 🌍2.3 配置中文 🌍2.4 其他配置 🌞1. Arduino IDE概述 Arduino IDE(Integrated Deve…...

『网络游戏』自适应制作登录UI【01】
首先创建项目 修改场景名字为SceneLogin 创建一个Plane面板 - 将摄像机照射Plane 新建游戏启动场景GameRoot 新建空节点重命名为GameRoot 在子级下创建Canvas 拖拽EventSystem至子级 在Canvas子级下创建空节点重命名为LoginWnd - 即登录窗口 创建公告按钮 创建字体文本 创建输入…...

用Manim简单解释奇异值分解(SVD)和图像处理方面的应
一,介绍 奇异值分解(SVD)是一种重要的矩阵分解技术,在统计学、信号处理和机器学习等领域有广泛应用。对于任意给定的矩阵 A(可以是任意形状的矩阵),SVD将其分解为三个特定的矩阵的乘积&#x…...

红外变电站分割数据集,标注为json格式,总共有5类,避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张),电压互感器(153张)
红外变电站分割数据集,标注为json格式,总共有5类 避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张)࿰…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...