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张)࿰…...

HBase 性能优化 详解
HBase 是基于 Hadoop HDFS 之上的分布式 NoSQL 数据库,具有高伸缩性和强大的读写能力。然而,由于其分布式架构和复杂的数据存储模式,在高并发、大规模数据场景下,HBase 性能优化至关重要。从底层原理和源代码层面理解 HBase 的特性…...

杭电2041-2050
2041 这里进入递归专题了 #include<bits/stdc.h> #include<iostream> //简单递归 using namespace std; long long int M[45]; int main() {int n;M[1]1;M[2]1;for(int i3;i<45;i){M[i]M[i-1]M[i-2];}while(cin>>n){while(n--){int m;cin>>m;cout…...

Ambari搭建Hadoop集群 — — 问题总结
Ambari搭建Hadoop集群 — — 问题总结 一、部署教程: 参考链接:基于Ambari搭建大数据分析平台-CSDN博客 二、问题总结: 1. VMwear Workstation 查看网关 2. 资源分配 参考: 硬盘:master(29 GBÿ…...

如何用python抓取豆瓣电影TOP250
1.如何获取网站信息? (1)调用requests库、bs4库 #检查库是否下载好的方法:打开终端界面(terminal)输入pip install bs4, 如果返回的信息里有Successfully installed bs4 说明安装成功(request…...

鸽笼原理与递归 - 离散数学系列(四)
目录 1. 鸽笼原理 鸽笼原理的定义 鸽笼原理的示例 鸽笼原理的应用 2. 递归的定义与应用 什么是递归? 递归的示例 递归与迭代的对比 3. 实际应用 鸽笼原理的实际应用 递归的实际应用 4. 例题与练习 例题1:鸽笼原理应用 例题2:递归…...

Ubuntu 20.04常见配置(含yum源替换、桌面安装、防火墙设置、ntp配置)
Ubuntu 20.04常见配置 1. yum源配置2. 安装桌面及图形化2.1 安装图形化桌面2.1.1 选择安装gnome桌面2.1.2 选择安装xface桌面 2.2 安装VNC-Server 3. ufw防火墙策略4. 时区设置及NTP时间同步4.1 时区设置4.2 NTP安装及时间同步4.2.1 服务端(例:172.16.32…...

AI学习指南深度学习篇-生成对抗网络的基本原理
AI学习指南深度学习篇-生成对抗网络的基本原理 引言 生成对抗网络(Generative Adversarial Networks, GANs)是近年来深度学习领域的一个重要研究方向。GANs通过一种创新的对抗训练机制,能够生成高质量的样本,其应用范围广泛&…...

什么是网络安全
网络安全是指通过采取必要措施,防范对网络的攻击、侵入、干扰、破坏和非法使用以及意外事故,使网络处于稳定可靠运行的状态,以及保障网络数据的完整性、保密性、可用性的能力。 网络安全涉及多个层面,包括硬件、软件及其系统中数…...

Redis list 类型
list类型 类型介绍 列表类型 list 相当于 数组或者顺序表 list内部的编码方式更接近于 双端队列 ,支持头插 头删 尾插 尾删。 需要注意的是,Redis的下标支持负数下标。 比如数组大小为5,那么要访问下标为 -2 的值可以理解为访问 5 - 2 3 …...

Linux更改固定IP地址
1.VMware里更改虚拟网络 一: 二: 三:确定就好了 2.修改Linux系统的固定IP 一:进入此文件 效果如下: 执行以下命令: 此时IP已更改 3.远程连接 这个是前提!!! 更改网络编辑器后网络适配器可能会修改,我就是遇着这个,困住我了一会 一:可以以主机IP对应连接 连接成功 二:主机名连…...