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

SQL专项练习第六天

        Hive 在处理不同数据需求时的灵活性和强大功能,包括间隔连续问题的处理、行列转换、交易数据查询、用户登录统计以及专利数据分析等方面。本文将介绍五个 Hive 数据处理问题的解决方案,并通过实际案例进行演示。

        先在home文件夹下建一个hivedata文件夹,把我们所需的数据写成txt文件导入到/home/hivedata/文件夹下面。

一、间隔连续问题

问题描述:给定一个游戏公司记录的用户每日登录数据表,要求计算每个用户最大的连续登录天数,可以间隔一天。

解决方案:

  1. 使用窗口函数lead获取每个用户下一次登录的日期,并计算与当前登录日期的天数差。
  2. 通过条件判断,如果天数差大于 2,则视为中断,否则继续累计连续登录天数。
  3. 使用窗口函数sum和条件判断,为连续登录的记录分配一个组 ID。
  4. 最后计算每个用户每个组的连续登录天数,并取最大值作为该用户的最大连续登录天数。

数据:

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;

二、行列转换

问题描述:有一个表记录了各年份各部门的平均绩效考核成绩,要求进行行列转换。

解决方案:

  1. 使用case when语句和聚合函数,按照年份进行分组,对不同部门的绩效得分进行条件判断并聚合。
  2. 通过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 天每天平均登录用户数量。

解决方案:

  1. 使用date_format函数将登录时间转换为日期格式。
  2. 使用count(distinct)统计每天不同的登录用户数量。
  3. 使用where子句筛选出近 30 天的登录记录。
  4. 对每天的登录用户数量进行平均计算。

建表:

-- 建表
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申请人,以及对应的专利申请数

解决方案:

  1. 首先使用lateral view explode函数将申请人字段拆分成多行。

  2. 然后按照申请人进行分组,统计每个申请人的专利申请数。

  3. 使用窗口函数rank按照专利申请数降序排序,为每个申请人分配一个排名。

  4. 最后选择排名在前 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;

代码如下:
方法一
  1. 使用lateral view explode函数将apply_users字段拆分成多行,每个申请人成为一条独立的记录。

  2. patent_type(专利类型)和apply_user(申请人)进行分组,统计每个申请人的专利申请数。

  3. 最后按照专利类型和申请数降序排序。

-- 方法一
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 ;
方法三
  1. 首先同样使用lateral view explode函数拆分申请人字段,得到中间表t2

  2. t2按专利类型和申请人分组,统计申请数,并使用窗口函数row_number()按照申请数降序为每个专利类型内的申请人分配排名。

  3. 筛选出排名小于等于 10 的记录,即每个专利类型的 top 10 申请人。

  4. 最后按照专利类型和申请数降序排序。

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

CSS——属性值计算

CSS——属性值计算 今天来详细讲解一下 CSS的属性值计算过程&#xff0c;这是 CSS 的核心之一&#xff08;另一个是视觉可视化模型&#xff0c;个人理解&#xff0c;这个相对复杂&#xff0c;以后再讲&#xff09;。 基本概念 层叠样式表&#xff1a;Cascade Style Sheet&am…...

408算法题leetcode--第26天

496. 下一个更大元素 I 题目地址&#xff1a;496. 下一个更大元素 I - 力扣&#xff08;LeetCode&#xff09; 题解思路&#xff1a;单调栈&#xff0c;如注释 时间复杂度&#xff1a;O(n m) 空间复杂度&#xff1a;O(n) 代码: class Solution { public:vector<int&g…...

JavaScript 与浏览器存储

JavaScript提供了两种存储数据的方式&#xff1a;LocalStorage和SessionStorage。这两种方式都是浏览器提供的客户端存储解决方案&#xff0c;可以将数据保存在用户的浏览器中&#xff0c;供网站使用。 LocalStorage和SessionStorage的区别在于数据的作用域和生命周期。 Loca…...

Chromium 如何查找已经定义好的mojom函数实现c++

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

图文深入理解Oracle DB Scheduler(续)-调度的创建

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

基于Springboot的宠物咖啡馆平台的设计与实现(源码+定制+参考)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、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&#xff1f; Nacos是一个开源的动态服务发现&#xff0c;配置管理和服务治理平台。主要用于构建原生应用和微服务架构。它是阿里巴巴开源的项目&#xff0c;整合了配置管理&#xff0c;服务管理&#xff0c;服务发现的功能&#xff0c;核心价值在于帮助用户在云平…...

CSS圆角

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

信息安全工程师(37)防火墙概述

前言 防火墙是一种网络安全系统&#xff0c;旨在监控和控制网络流量&#xff0c;根据预定义的安全规则决定是否允许数据包的传输。 一、定义与功能 定义&#xff1a;防火墙是网络安全的第一道防线&#xff0c;由硬件设备和软件系统共同构成&#xff0c;位于外网与内网之间、公共…...

多元化网络团队应对复杂威胁

GenAI、ML 和 IoT 等技术为威胁者提供了新的工具&#xff0c;使他们更容易针对消费者和组织发起攻击。 从诱骗受害者陷入投资骗局的Savvy Seahorse &#xff0c;到使用 ChatGPT 之类的程序感染计算机并阅读电子邮件的自我复制 AI 蠕虫&#xff0c;新的网络威胁几乎每天都在出现…...

Observer(观察者模式)

1. 意图 定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 在观察者模式中&#xff0c;有两类对象&#xff1a;被观察者&#xff08;Subject&#xff09;和观察者&#xff08;Observer&#xf…...

Python深度学习进阶与前沿应用:注意力机制、Transformer模型、生成式模型、目标检测算法、图神经网络、强化学习等

近年来&#xff0c;伴随着以卷积神经网络&#xff08;CNN&#xff09;为代表的深度学习的快速发展&#xff0c;人工智能迈入了第三次发展浪潮&#xff0c;AI技术在各个领域中的应用越来越广泛。为了帮助广大学员更加深入地学习人工智能领域最近3-5年的新理论与新技术&#xff0…...

24.1 prometheus-exporter管理

本节重点介绍 : exporter 流派 必须和探测对象部署在一起的1对多的远端探针模式 exporter管控的难点 1对1 的exporter 需要依托诸如 ansible等节点管理工具 &#xff0c;所以应该尽量的少 1对1的exporter改造成探针型的通用思路 exporter 流派 必须和探测对象部署在一起的…...

【Arduino IDE安装】Arduino IDE的简介和安装详情

目录 &#x1f31e;1. Arduino IDE概述 &#x1f31e;2. Arduino IDE安装详情 &#x1f30d;2.1 获取安装包 &#x1f30d;2.2 安装详情 &#x1f30d;2.3 配置中文 &#x1f30d;2.4 其他配置 &#x1f31e;1. Arduino IDE概述 Arduino IDE&#xff08;Integrated Deve…...

『网络游戏』自适应制作登录UI【01】

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

用Manim简单解释奇异值分解(SVD)和图像处理方面的应

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

红外变电站分割数据集,标注为json格式,总共有5类,避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张),电压互感器(153张)

红外变电站分割数据集&#xff0c;标注为json格式&#xff0c;总共有5类 避雷器&#xff08;289张&#xff09;&#xff0c;绝缘子&#xff08;919张&#xff09;&#xff0c;电流互感器&#xff08;413张&#xff09;&#xff0c;套管&#xff08;161张&#xff09;&#xff0…...

HBase 性能优化 详解

HBase 是基于 Hadoop HDFS 之上的分布式 NoSQL 数据库&#xff0c;具有高伸缩性和强大的读写能力。然而&#xff0c;由于其分布式架构和复杂的数据存储模式&#xff0c;在高并发、大规模数据场景下&#xff0c;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集群 — — 问题总结 一、部署教程&#xff1a; 参考链接&#xff1a;基于Ambari搭建大数据分析平台-CSDN博客 二、问题总结&#xff1a; 1. VMwear Workstation 查看网关 2. 资源分配 参考&#xff1a; 硬盘&#xff1a;master&#xff08;29 GB&#xff…...

如何用python抓取豆瓣电影TOP250

1.如何获取网站信息&#xff1f; &#xff08;1&#xff09;调用requests库、bs4库 #检查库是否下载好的方法&#xff1a;打开终端界面&#xff08;terminal&#xff09;输入pip install bs4, 如果返回的信息里有Successfully installed bs4 说明安装成功&#xff08;request…...

鸽笼原理与递归 - 离散数学系列(四)

目录 1. 鸽笼原理 鸽笼原理的定义 鸽笼原理的示例 鸽笼原理的应用 2. 递归的定义与应用 什么是递归&#xff1f; 递归的示例 递归与迭代的对比 3. 实际应用 鸽笼原理的实际应用 递归的实际应用 4. 例题与练习 例题1&#xff1a;鸽笼原理应用 例题2&#xff1a;递归…...

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 服务端&#xff08;例&#xff1a;172.16.32…...

AI学习指南深度学习篇-生成对抗网络的基本原理

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

什么是网络安全

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

Redis list 类型

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

Linux更改固定IP地址

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