SQL专项练习第三天

news2024/12/1 0:24:56

        在大数据处理中,Hive 是一个常用的工具,它可以对大规模数据进行高效的查询和分析。本文将介绍五个 Hive 数据处理问题的解决方案,并通过实际案例进行演示。 

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

一、统计每个成绩段人数

问题描述:给定一组包含学生姓名和成绩的数据,要求按照成绩段统计人数,成绩大于 90 为优、大于 80 为良、大于 60 为中,不及格为差。

解决方案:

  1. 使用get_json_object函数从 JSON 格式的字符串中提取学生姓名和成绩。
  2. 使用if函数判断成绩所属的成绩段,并为每个成绩分配一个等级。
  3. 按等级分组,统计每个等级的人数。

数据:

data数据如下:
{"username":"张三","score":95}
{"username":"李四","score":76}
{"username":"赵本山","score":92}
{"username":"王五","score":76}
{"username":"赵六","score":62}
{"username":"赵六1","score":62}
{"username":"赵六2","score":26}
{"username":"赵六3","score":89}
{"username":"赵六4","score":77}

建表:

-- 建表
create table if not exists scores(
   c1  string
)
row format serde 'org.openx.data.jsonserde.JsonSerDe';
-- 导入数据
load data local inpath '/home/hivedata/zy01.txt' into table scores;

代码如下:

with t as (
    select get_json_object(c1,'$.username')  username,
       get_json_object(c1,'$.score') score,
       `if`(get_json_object(c1,'$.score') > 90,'优',
           if(get_json_object(c1,'$.score')>=80,'良',
               `if`(get_json_object(c1,'$.score')>=60,'中','不及格')) ) grade
from scores
)
select grade,count(1) rs from t group by grade  ;

二、支付次数和累计充值金额统计

问题描述:有一个包含用户 ID、日期、交易类型、交易金额和交易方向的表,要求统计每个用户的支付次数和累计充值金额。

解决方案:

  1. 对表进行筛选,只保留充值交易类型的记录。
  2. 按用户 ID 分组,使用sum函数计算每个用户的累计充值金额。
  3. 使用窗口函数统计每个用户的支付次数。

数据:

u_001,20191201,支付,20000,支
u_001,20191203,充值,30010,收
u_001,20191203,提现,50000,支
u_001,20191208,支付,20000,支
u_001,20191210,充值,30010,收
u_001,20191220,提现,50000,支
u_002,20191202,支付,20000,支
u_002,20191202,转入,30010,收
u_002,20191230,充值,50000,收
u_003,20200110,支付,60.68,支
u_004,20200111,支付,90.05,支
u_004,20200114,充值,100.1,收
u_005,20200101,还款,30010,支

建表:

-- 建表
create table t7(
  user_id     string,
  date_dt     string,
  trans_type  string,
  trans_amt   double,
  trans_dc    string
)row format delimited fields terminated by ',';
-- 导入数据
load data local inpath '/home/hivedata/zy02.txt' into table t7;

代码如下:

-- 您需要找出每个月支付次数大于3次,且每月累计充值金额大于10000元的用户交易记录。结果集需要包含 user_id 和 data_month(月份)
select user_id, substr(date_dt,1,6) as data_month
from t7 where trans_dc = '支' or trans_type = '充值'
group by user_id, substr(date_dt,1,6)
having count(*) > 3 or sum(trans_type) > 10000;

三、订单数据统计

  1. 统计每个用户截至每次下单的累积下单总额

    • 使用窗口函数sumover子句,按照用户姓名分组并按照下单日期排序,计算每个用户截至每次下单的累积下单总额。
  2. 统计每个用户截至每次下单的当月累积下单总额

    • 同样使用窗口函数sumover子句,但是在分组时除了用户姓名还加上下单日期的月份部分,按照下单日期排序,计算每个用户截至每次下单的当月累积下单总额。
  3. 统计每个用户每次下单距离上次下单相隔的天数(首次下单按 0 天算)

    • 使用窗口函数lag获取每个用户上一次下单的日期,然后使用datediff函数计算当前下单日期与上一次下单日期的天数差。如果是首次下单,则默认相隔天数为 0。
  4. 为每个用户的所有下单记录按照订单金额进行排名

    • 使用窗口函数dense_rank按照用户姓名分组并按照订单金额降序排序,为每个用户的下单记录进行排名。

建表:

create table order_info
(
  order_id     string,         --订单id
  user_id      string,         --用户id
  user_name    string,         --用户姓名
  order_date   string,         --下单日期
  order_amount  int            --订单金额
);
insert overwrite table order_info
values('1','1001','小元','2022-01-01','10'),
('2','1002','小海','2022-01-02','15'),
('3','1001','小元','2022-02-03','23'),
('4','1002','小海','2022-01-04','29'),
('5','1001','小元','2022-01-05','46'),
('6','1001','小元','2022-04-06','42'),
('7','1002','小海','2022-01-07','50'),
('8','1001','小元','2022-01-08','50'),
('9','1003','小辉','2022-04-08','62'),
('10','1003','小辉','2022-04-09','62'),
('11','1004','小猛','2022-05-10','12'),
('12','1003','小辉','2022-04-11','75'),
('13','1004','小猛','2022-06-12','80'),
('14','1003','小辉','2022-04-13','94');

代码如下:

-- 1.统计每个用户截至每次下单的累积下单总额
select *,sum(order_amount) over(partition by user_name order by order_date) from order_info;

-- 2.统计每个用户截至每次下单的当月累积下单总额
select *,sum(order_amount) over(partition by user_name,substr(order_date,1,7) order by order_date) from order_info;

-- 3.统计每个用户每次下单距离上次下单相隔的天数(首次下单按0天算)
select *,datediff(
    to_date(order_date),
    to_date(lag(order_date,1,order_date) over(partition by user_name order by order_date))) days from order_info;

-- 4.为每个用户的所有下单记录按照订单金额进行排名
select *,dense_rank() over (partition by user_name order by order_amount desc) from order_info;

四、网站登录时间间隔统计

问题描述:给定一个网站登录记录表,包含用户 ID 和登录时间,要求计算每个用户登录日期间隔小于 5 天的次数。

解决方案:

  1. 使用窗口函数lag获取每个用户上一次登录的时间,并计算当前登录时间与上一次登录时间的天数差。
  2. 筛选出天数差大于等于 1 且小于等于 5 的记录。
  3. 按用户 ID 分组,统计每个用户登录日期间隔小于 5 天的次数。

建表:

create table login_info(
   user_id string,
   login_time string
);

INSERT INTO
login_info(user_id,login_time)
VALUEs('a001','2021-01-01')
,('b001','2021-01-01')
,('a001','2021-01-03')
,('a001','2021-01-06')
,('a001','2021-01-07')
,('b001','2021-01-07')
,('a001','2021-01-08')
,('a001','2021-01-09')
,('b001','2021-01-09')
,('b001','2021-01-10')
,('b001','2021-01-15')
,('a001','2021-01-16')
,('a001','2021-01-18')
,('a001','2021-01-19')
,('b001','2021-01-20')
,('a001','2021-01-23');

代码如下:

with t as (
    select *,
       lag(login_time,1,login_time) over (partition by user_id order by login_time ) last_time,
       datediff(login_time,lag(login_time,1,login_time) over (partition by user_id order by login_time )) days  from login_info
)
select user_id,count(1) from t where days >=1 and days <=5 group by user_id;

五、蚂蚁森林,连续问题

问题描述:有一个蚂蚁森林的数据表,包含用户 ID、日期和减少的碳排放量,要求找出连续 3 天及以上减少碳排放量在 100 以上的用户。

解决方案:

  1. 首先使用group byhaving子句筛选出减少碳排放量在 100 以上的记录。
  2. 然后使用窗口函数row_numberdate_sub计算一个临时列,用于判断连续日期。
  3. 最后按用户 ID 和临时列分组,统计数量大于等于 3 的用户 ID。

数据:

id     dt       lowcarbon
1001 2021-12-12 123
1002 2021-12-12 45
1001 2021-12-13 43
1001 2021-12-13 45
1001 2021-12-13 23
1002 2021-12-14 45
1001 2021-12-14 230
1002 2021-12-15 45
1001 2021-12-15 23

建表:

create table mayi(
  uid int,
  dt string,
  lowcarbon int
)row format delimited
fields terminated by ' ';

load data local inpath '/home/hivedata/mayi.txt' into table mayi;

代码如下:

with t as (
  select id,dt,sum(lowcarbon) sumCarbon
  from lowcarbon_data group by id,dt having sumCarbon >=100
),t2 as (
  select *,date_sub(dt,row_number() over (
      partition by id order by dt )) temp_date
  from t
)
select id from t2 group by id,temp_date having count(1) >=3;

        通过以上五个问题的解决,展示了 Hive 在数据处理中的强大功能和灵活性。无论是统计成绩段人数、分析支付和充值数据、处理订单数据、统计网站登录时间间隔还是解决蚂蚁森林的连续问题,Hive 都能提供高效的解决方案。

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

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

相关文章

Springboot 整合 logback 日志框架

文章目录 整合 Logback 日志框架第一步&#xff1a;导入依赖第二步&#xff1a;导入配置&#xff08;logback.xml&#xff09;详解 使用&#xff08;记录日志&#xff09; 遇到问题一解决方案 整合 Logback 日志框架 第一步&#xff1a;导入依赖 &#xff08;Springboot 会自己…

网站开发的发展(后端路由/前后端分离/前端路由)

1.后端路由阶段 在早期的网站开发中 网页的渲染工作其实是交由服务器完成的 所以该渲染也被称之为后端渲染 具体的过程就是&#xff1a;浏览器发送url给服务器 服务器解析该url 使用后端路由(在服务器中 用于储存url和页面映射关系的路由)获取指定url对应的页面 然后交由jsp去…

洛谷每日一题(P1229 遍历问题)

原题目链接&#xff1a; P1229 遍历问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 原题目截图&#xff1a; 思路分析&#xff1a; 1、为什么会出现多个不同序列&#xff1f; 前序遍历和后序遍历序列无法唯一确定一棵二叉树的原因主要在于这两种遍历方式都缺少了关于…

linux基础 超级笔记

1.Linux系统的组成 Linux系统内核&#xff1a;提供系统最核心的功能&#xff0c;如软硬件和资源调度。 系统及应用程序&#xff1a;文件、任务管理器。 2.Linux发行版 通过修改内核代码自行集成系统程序&#xff0c;即封装。比如Ubuntu和centos这种。不过基础命令是完全相…

Android.mk中宏定义的高级用法剖析-安卓framework高级实战

背景&#xff1a; 前面的blog有讲解如何在Android.mk中进行控制安卓cpp源码中ifdef定义变量-干货技能分享&#xff0c;主要就是针对c代码中经常出现的#ifdef判断进行了剖析和实战 但是仅仅有上面的ifdef判断这个宏是否存在是不是对宏定义作用没有发挥到最大&#xff0c;是否可…

esp8266 at指令链接wifi时一直connect disconnest

那是你的连接wifi的名字密码有误或者热点有问题&#xff0c;看看热点是不是把设备拉入黑名单或者设置为5G或者连了校园网或者设置了最多链接设备

vAPI靶场

前言 自行去搭建vAPI靶场&#xff0c;配合postman使用 vapi1 创建用户 第一个用户 {"username": "shi","name": "shi1","course": "nihao","id": 10 } 第二个用户 {"username": "hui…

Pandas -----------------------基础知识(主要matplotlib知识)(七)

Dataframe变形 转置 T import pandas as pddata {2022: [10, 30, 15, 20], 2023: [40, 50, 36, 21]} df1 pd.DataFrame(data, index[q1, q2, q3, q4]) print("原始数据框&#xff1a;") print(df1)df2 df1.Tprint("转换后数据框&#xff1a;") print(df…

并查集——从LeetCode题海中总结常见套路

目录 并查集定义 LeetCode128.最长连续序列 先去重再sort&#xff1a; 改进去重的方法&#xff1a; 参考&#xff1a; 并查集定义 在计算机科学中&#xff0c;并查集是一种树型的数据结构&#xff0c;用于处理一些不交集&#xff08;Disjoint Sets&#xff09;的合并及查…

毕业设计选题:基于ssm+vue+uniapp的医院管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

管道内裂缝检测数据集 2000张 管道裂缝 带标注voc yol

管道内裂缝检测数据集 2000张 管道裂缝 带标注voc yol 管道内裂缝检测数据集 (Pipeline Crack Detection Dataset) 数据集概述 该数据集是一个专门用于训练和评估管道内裂缝检测模型的数据集。数据集包含2000张图像&#xff0c;每张图像都带有标注信息&#xff0c;标注格式为…

JavaScript中的高阶函数

高阶函数 所谓高阶函数&#xff0c;就是操作函数的函数&#xff0c;它接收一个或多个函数作为参数&#xff0c;并返回一个新函数&#xff1a; 来看一个mapper()函数&#xff0c;将一个数组映射到另一个使用这个函数的数组上&#xff1a; 更常见的例子&#xff0c;它接收两个函…

【Kubernetes】常见面试题汇总(五十六)

目录 123. pod 创建失败&#xff1f; 124. kube-flannel-ds-amd64-ndsf7 插件 pod 的 status 为 Init:0/1 &#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#x…

5G NR物理信号

文章目录 NR 物理信号与LTE的区别上行参考信号DMRS (UL)SRSPT-RS(UL) 下行参考信号DMRS(DL)PT-RS(DL)CSI-RSPSSSSS NR 物理信号与LTE的区别 用SSS、CSI-RS和DMRS 取代了CRS信号。下行业务信道采用TM1波束赋形传输模式。基于SSB 或者CSI-RS进行RSRP和SINR测量。基于DMRS 进行共…

Golang | Leetcode Golang题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; func circularArrayLoop(nums []int) bool {n : len(nums)next : func(cur int) int {return ((curnums[cur])%n n) % n // 保证返回值在 [0,n) 中}for i, num : range nums {if num 0 {continue}slow, fast : i, next(i)// 判断非零且方…

linux—进程控制

进程创建 使用fork函数可以在一个进程中创建一个子进程 fork函数 #include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() {printf("begin: 我是一个进程&#xff0c;pid: %d,ppid:%d\n",getpid(),getppid());pid_t id fo…

Java项目实战II基于Java+Spring Boot+MySQL的宠物咖啡馆平台的设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 在快节奏的城市生活中&#xff0c;宠物咖啡馆作为一种结合了休闲与宠物陪伴的新型业态&#xff0c;正…

数据服务-实时同步(sersync)

1. 概述 1.之前我们通过rsync定时任务实现定时备份/同步 2. 对于NFS我们需要进行实时同步 2. Sersync原理 3. 上手指南 环境主机web0110.0.0.7(nfs客户端)nfs0110.0.0.31(rsync客户端) (nfs服务端)backup10.0.0.41(rsync服务端) 3.1 rsync服务端准备 参考: 数据服务-备份服务…

[c++高阶] 继承深度剖析

1.前言 继承 是 面向对象三大特性之一&#xff08;封装、继承、多态&#xff09;&#xff0c;所有的面向对象&#xff08;OO&#xff09;语言都具备这三个基本特征&#xff0c;封装相关概念已经在《类和对象》系列中介绍过了&#xff0c;今天主要学习的是 继承&#xff0c;即如…

RTX4060+ubuntu22.04+cuda11.8.0+cuDNN8.6.0 如何根据显卡型号和系统配置cuda和cuDNN所需的安装环境

文章目录 &#x1f315;电脑原配置&#x1f315;安装cuda和cuDNN前的环境选择&#x1f319;cuDNN与CUDA tookit和nvidia driver的对应关系&#x1f319;cuda版本选择⭐查看自己的nvidia driver版本和最大支持的CUDA版本⭐最小支持版本 &#x1f319;查看11.8.0版本的cuda和ubun…