SQL专项练习第四天

       Hive 在不同数据处理场景下的强大功能和灵活性,包括行转列、多维度统计、访客分析和日期计算等方面。本文将介绍五个 Hive 数据处理问题的解决方案,并通过实际案例进行演示。  

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

一、成绩表行转列

问题描述:给定一个学生成绩表t_student2,包含学生 ID、姓名、课程和成绩,要求将课程列进行行转列操作,展示每个学生的各科成绩。

输出结果:
姓名  语文  数学  英语
张三  95    86   78
李四  80    96   88

解决方案:

使用case when语句和聚合函数,按照学生姓名进行分组,对不同课程的成绩进行条件判断并求和,实现行转列的效果。

建表:

CREATE TABLE `t_student2` (`id`     int     NOT NULL  COMMENT '主键 id',`name`   string  COMMENT '姓名',`course` string  COMMENT '课程',`score`  int     COMMENT '成绩'
)INSERT INTO `t_student2` VALUES (1,'张三', '语文', 95),
(2,'李四', '语文', 99),(3,'王五', '语文', 80),(4,'张三', '数学', 86),(5,'李四', '数学', 96),
(6,'王五', '数学', 81),(7,'张三', '英语', 78),(8,'李四', '英语', 88),(9,'王五', '英语', 87);

代码如下:
selectname,sum(case when course ='语文' then score else 0 end) `语文`,sum(case when course ='数学' then score else 0 end) `数学`,sum(case when course ='英语' then score else 0 end) `英语`
from t_student2 group by name;

二、订单数、用户数、新客数统计

问题

1)给出2017年每个月的订单数、用户数、总成交金额。
2)给出2017年11月的新客数(指在11月才有第一笔订单)

 数据
 

2017-01-01,10029001,1,33.57
2017-01-03,10029002,1,53.57
2017-01-11,10029003,2,63.57
2017-01-11,10029013,3,63.57
2017-02-02,10029004,1,73.57
2017-02-07,10029005,1,83.57
2017-02-15,10029006,1,93.57
2017-03-04,10029007,2,33.57
2017-04-01,10029008,1,53.57
2017-05-11,10029009,1,63.57
2017-05-21,10029010,2,73.57
2017-06-01,10029011,1,93.57
2017-06-07,10029012,1,13.57
2017-07-09,10029013,2,33.57
2017-07-20,10029014,1,23.57
2017-08-01,10029015,2,73.57
2017-09-09,10029016,2,93.57
2017-10-01,10029017,1,33.57
2017-11-11,10029018,1,36.57
2017-11-12,10029119,6,136.57
2017-11-21,10029019,1,37.57
2017-12-11,10029020,1,38.57

建表:

--  建表
create table order_tab(dt string,order_id string,user_id string,amount decimal(10,2))
row format delimited fields terminated by ',';
-- 导入数据
load data local inpath '/home/hivedata/zy03.txt' into table order_tab;

2017 年每个月的订单数、用户数、总成交金额

使用group by按照月份对数据进行分组。

使用聚合函数分别统计每个月的订单数、用户数和总成交金额。

代码如下:
selectsubstr(dt, 1, 7) AS year_month,count(order_id) AS order_count,count(DISTINCT user_id) AS user_count,sum(amount) AS total_amount
fromorder_tab
wheresubstr(dt, 1, 4) = '2017'
group bysubstr(dt, 1, 7)
order byyear_month;

2017 年 11 月的新客数

首先找出在 2017 年 11 月之前没有订单记录的用户。

然后统计这些用户在 2017 年 11 月的订单数量,即为新客数。

代码如下:

selectcount(distinct user_id) as new_customers
fromorder_tab
wheremonth(dt) = 11 and year(dt) = 2017and not exists (select 1from order_tab as prev_orderswhereprev_orders.user_id = order_tab.user_idand month(prev_orders.dt) < 11and year(prev_orders.dt) = 2017);

三、京东店铺访问统计

访问日志存储的表名为Visit,访客的用户id为user_id,被访问的店铺名称为shop,请统计:
1)每个店铺的UV(访客数)

 店铺名称   uv值

2)每个店铺访问次数top3的访客信息。输出店铺名称、访客id、访问次数

店铺名称  用户编号  访问次数
    a        u1         10
    a        u3         8
    a        u6         7
    b        xx         xx
    b        xx         xx
    b        xx         xx

 

建表:

-- 建表
create table visit(user_id string,shop    string
)row format delimited
fields terminated by '\t';
-- 导入数据
load data local inpath '/home/hivedata/jingdong.txt' into table visit;

每个店铺的 UV(访客数)

使用group by按照店铺名称进行分组。

使用count(distinct)统计每个店铺的不同访客数量。

代码如下:
select shop, count(distinct user_id) as uv
from visit
group by shop;

每个店铺访问次数 top3 的访客信息

使用窗口函数按照店铺名称和访客 ID 分组,统计每个访客的访问次数。

使用dense_rank()窗口函数为每个店铺内的访客按照访问次数进行排名。

筛选出排名前三的访客信息。

代码如下:
with t as (selectshop,user_id,count(*) AS visit_count,row_number() over (partition by shop order by count(*) desc ) as rankfrom visitgroup by shop, user_id
)
selectshop,user_id as `用户编号`,visit_count as `访问次数`
from t
where rank <= 3;

四、店铺访问数据统计

问题描述:给定用户访问数据,包含用户 ID、访问日期和访问次数,要求统计每个用户的累计访问次数。

如下所示:

用户 月份 小计 累计
u01 2017-01 11 11
u01 2017-02 12 23
u02 2017-01 12 12
u03 2017-01 8  8
u04 2017-01 3  3

解决方案:

  1. 使用substr函数将访问日期转换为月份格式。
  2. 使用窗口函数按照用户 ID 和月份进行分区,统计每个用户每个月的小计访问次数。
  3. 再次使用窗口函数按照用户 ID 进行分区,对小计访问次数进行累加得到累计访问次数。

数据:

userID visitDate visitCount
u01 2017-01-21 5
u02 2017-01-23 6
u03 2017-01-22 8
u04 2017-01-20 3
u01 2017-01-23 6
u01 2017-02-21 8
u02 2017-01-23 6
u01 2017-02-22 4

建表:

-- 建表
create table shopping(userID string,visitDate string,visitCount int
)row format delimited
fields terminated by ' '
tblproperties("skip.header.line.count"="1");
-- 导入数据
load data local inpath '/home/hivedata/shops.txt' into table shopping;

代码如下:
with t as (select userID,substr(visitDate, 1, 6) as visitMonth,sum(visitCount) as monthCountfrom shoppinggroup by  userID, substr(visitDate, 1, 6)
)
select userID, visitMonth as `月份`, monthCount as `小计`,sum(monthCount) over (partition by userID order by visitMonth) as `累计`
from t order by userID, visitMonth;

五、计算连续用户完成订单间隔最大的天数和最小的天数

问题描述:有一个订单表t15,包含用户 ID、订单日期和订单金额,要求计算每个用户完成订单间隔的最大天数和最小天数。

uid_1  max_day  min_day
uid_1    4         1

解决方案:

  1. 使用窗口函数lead获取每个用户下一个订单的日期。
  2. 使用datediff函数计算当前订单日期与下一个订单日期的天数差。
  3. 对天数差进行处理,减去 1 得到实际的间隔天数。
  4. 按用户 ID 分组,使用聚合函数maxmin分别计算最大和最小间隔天数。

数据:

user_id   dt            amt
uid_1    20200501       10
uid_1    20200503       160
uid_1    20200508       201
uid_1    20200511       103
uid_1    20200516       119

建表:

-- 建表
create table t15(user_id string,dt      string,amt     int
)row format delimited
fields terminated by ' '
tblproperties("skip.header.line.count"="1");
-- 导入数据
load data local inpath '/home/hivedata/homework0830/t15.txt' into table t15;

代码如下:

with t as (select user_id, dt,lag(dt) over (partition by user_id order by unix_timestamp(dt, 'yyyyMMdd') asc) as prev_dt,row_number() over (partition by user_id order by unix_timestamp(dt, 'yyyyMMdd') asc) as rnFROM t15
),t2 as (select user_id, dt,case when prev_dt is null then null else`floor`((unix_timestamp(dt, 'yyyyMMdd')- unix_timestamp(prev_dt, 'yyyyMMdd') - 1) / 86400)end as days_difffrom t where rn > 1
)
select user_id, max(days_diff) AS max_day, min(days_diff) AS min_day
from t2 group by user_id;

        通过以上五个问题的解决,展示了 Hive 在不同数据处理场景下的强大功能和灵活性,包括行转列、多维度统计、访客分析和日期计算等方面。

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

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

相关文章

矩阵式键盘接口设计(用单片机读取4x4矩阵式键盘的键号,并将其显示在数码管上)(Proteus 与Keil uVision联合仿真)

一、实验原理 1、分析电路中按键状态检测的方法。 矩阵式&#xff08;也称行列式&#xff09;键盘用于按键数目较多的场合&#xff0c;由行线和列线组成&#xff0c;按键位于行、列交叉点上&#xff0c;见图5-26&#xff0c;一个44的行、列结构可以构成一个16个按键的键盘&…

FastAPI框架使用枚举来型来限定参数、FastApi框架隐藏没多大意义的Schemes模型部分内容以及常见的WSGI服务器Gunicorn、uWSGI了解

一、FastAPI框架使用枚举来型来限定参数 FastAPI框架验证时&#xff0c;有时需要通过枚举的方式来限定参数只能为某几个值中的一个&#xff0c;这时就可以使用FastAPI框架的枚举类型Enum了。publish:December 23, 2020 -Wednesday 代码如下&#xff1a; #引入Enum模块 from fa…

一张图片生成数字人的3D发型:技术创新与应用前景

随着人工智能(AI)和计算机图形学的不断进步,从单张肖像图像生成3D数字头发的技术正在变得越来越成熟。这项技术不仅能够处理复杂的编织和未编织发型,还能在虚拟现实、电影制作和美容行业中找到广泛的应用。本文将详细介绍一种创新的3D头发重建技术,探讨其关键特性、技术创…

Dit架构 diffusion范式分类+应用

1.ping 网址 2.ssh nscc/l20 3.crtl,打开vscode的setting 4.win 10修改ssh配置文件及其密钥权限为600 - 晴云孤魂 - 博客园 整体来看&#xff1a; 使用transformer作为其主干网络&#xff0c;代替了原先的UNet 在latent space进行训练&#xff0c;通过transformer处理潜…

搬砖 网盘一键转存源码

网盘一键转存源码&#xff0c;免费资源没测试 网盘一键转存源码&#xff0c;可以将您的百度网盘资源一键转存到。并支持后台设置开屏广告 源码截图&#xff1a; 下载地址&#xff1a; https://yuncv.lanzouw.com/i8dZk2btyl4h

04. maven 三种项目打包方式 pom、jar、war 的区别(记一次 Spring 项目启动报错)

文章目录 1. 记一次 Spring 项目启动报错1.1 现象1.2 分析1.3 过程复现 2. maven 项目三种打包方式的区别 1. 记一次 Spring 项目启动报错 1.1 现象 我在项目下创建了一个子模块&#xff0c;然后又将该子模块移除&#xff0c;之后启动报错&#xff0c;如下&#xff1a; com.…

深入理解 Java 对象的内存布局

对于 Java 虚拟机&#xff0c;都知道其内存区域划分成&#xff1a;堆、方法区、虚拟机栈等区域。但一个对象在 Java 虚拟机中是怎样存储的&#xff0c;相信很少人会比较清楚地了解。Java 对象在 JVM 中的内存布局&#xff0c;是了解并发编程同步机制的基础。 在 HotSpot 虚拟机…

通信工程学习:什么是IOT物联网

IOT&#xff1a;物联网 IOT物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是一种通过信息传感设备&#xff0c;按约定的协议&#xff0c;将任何物体与网络相连接&#xff0c;以实现智能化识别、定位、跟踪、监管等功能的技术体系。以下是对IOT物联网的详…

Windows 通过 Docker 安装 GitLab

1. 安装 Docker Desktop 下载网站&#xff1a;Windows | Docker Docs 2. 拉取 GitLab Docker 镜像 打开 PowerShell 或 命令提示符&#xff0c;拉取 GitLab 镜像&#xff1a; docker pull gitlab/gitlab-ee:latest或则使用社区版&#xff1a; docker pull gitlab/gitlab-ce…

电脑无法无线投屏的解决办法

在前司的时候经常遇到电脑无法使用无线投屏器的情况&#xff0c;今天就来聊聊如何解决。 1.不会连接。这种情况&#xff0c;经常发生在WIN10升级WIN11之后&#xff0c;一般是两种办法&#xff0c;一种是同时按键盘上的WINDOWS和K键&#xff0c;右下角就会出来连接的图标&#…

showdoc二次开发

showdoc用的vue版本老&#xff0c;需要安装老版本nodejs&#xff0c;比如node 14.21.3 win32-x64-93_binding.node问题 https://github.com/sass/node-sass/releases 下载 web_src\node_modules\node-sass\vendor\win32-x64-93 下面重命名为binding.node 代理到php后端&…

2-114 基于matlab的CA模型

基于matlab的CA模型&#xff0c;Singer模型对单机动目标进行跟踪算法&#xff0c;具有10页实验文档。采用蒙特卡罗方法对一个二坐标雷达对一平面上运动的目标进行观测&#xff0c;得到跟踪滤波结果。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-114 …

Crypto虐狗记---”你“和小鱼(八)

前言&#xff1a;剧情八 提示&#xff1a; 下载&#xff1a; 只给了公钥 那么可以用RsaCtfTool去分离公钥---》 得到(e&#xff0c;n)&#xff1a; 如何安装参考&#xff1a; kail下安装RsaCtfTool - 九皋777 - 博客园 (cnblogs.com) 已知n&#xff0c;那么去得到p q 或者使…

OBOO鸥柏丨深圳科学展馆引入液晶拼接屏中控宣传协议互动大屏

科技馆的展厅展区&#xff0c;宛如一扇通往未来世界的璀璨窗口&#xff0c;巧妙融合了OBOO鸥柏LCD液晶拼接屏的尖端显示技术&#xff0c;液晶拼接墙与沉浸式体感交互的梦幻体验交织成一幅幅生动的科技画卷。这里&#xff0c;中控协议的精准对接&#xff0c;如同智慧之网的织就者…

whisper 实现语音识别 ASR - python 实现

语音识别&#xff08;Speech Recognition&#xff09;&#xff0c;同时称为自动语音识别&#xff08;英语&#xff1a;Automatic Speech Recognition, ASR&#xff09;&#xff0c;将语音音频转换为文字的技术。 whisper是一个通用的语音识别模型&#xff0c;由OpenAI公司开发。…

家具城管理平台———未来之窗行业应用跨平台架构

一、家具城商城管理数字化 家具城商城电子化管理优势显著。能实时精确掌控库存&#xff0c;及时补货并降低积压。通过销售数据的精准分析&#xff0c;把握市场需求&#xff0c;优化采购与营销。提升客户服务&#xff0c;记录购买历史以提供个性化体验。简化采购&#xff0c;自动…

leetcode 力扣算法题 快慢指针 双指针 19.删除链表的倒数第n个结点

删除链表的倒数第N个结点 题目要求题目示例解题思路从题目中的已知出发思考寻找目标结点条件转换核心思路 需要注意的点改进建议 完整代码提交结果 题目要求 给你一个链表&#xff0c;删除链表的倒数第n个结点&#xff0c;并且返回链表的头结点。 题目示例 示例 1&#xff1…

微信小程序和抖音小程序的分享和广告接入代码

开发完成小程序或者小游戏之后&#xff0c;我们为什么要接入分享和广告视频功能&#xff0c;主要原因有以下几个方面。 微信小程序和抖音小程序接入分享和广告功能主要基于以下几个原因&#xff1a; 用户获取与增长&#xff1a;分享功能可以帮助用户将小程序内容传播给更多人&…

Crypto虐狗记---”你“和小鱼(外传)

前言&#xff1a;剧情十(我没看见还有一个。。。。) 提示&#xff1a; 下载&#xff1a; 参数有了&#xff0c;直接搞就行。。。 参考&#xff1a; *crypto*练2--攻防世界--easy_ECC - kubopiy - 博客园 (cnblogs.com) 大佬的脚本&#xff1a; 攻防世界 easy_ECC - diakla -…

鸿蒙next开发第一课03.ArkTs语法介绍-案例

前面已经学习了ArkTs的基本语法和DevEcoStudio的基本操作&#xff0c;接下来按照官方提示开发一个基本案例。 该案例是系统自带的demo&#xff0c;下载下来源代码后可以直接运行。 接下来我来演示如何运行demo。我在demo中加入了自己的注释。 切记&#xff1a;文件夹不能有中…