大数据技术之Hive SQL题库-高级

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 大数据技术之Hive SQL题库-高级

第1题 同时在线人数问题

1.1 题目需求

现有各直播间的用户访问记录表(live_events)如下,表中每行数据表达的信息为,一个用户何时进入了一个直播间,又在何时离开了该直播间。

1686552330436.png

现要求统计各直播间最大同时在线人数,期望结果如下:

live_id

max_user_count

1

4

2

3

3

2


1.2 数据准备

1)建表语句

rop table if exists live_events;
create table if not exists live_events
(
user_id int comment '用户id',
live_id int comment '直播id',
in_datetime string comment '进入直播间时间',
out_datetime string comment '离开直播间时间'
)
comment '直播间访问记录';

2)数据装载

INSERT overwrite table live_events


VALUES (100, 1, '2021-12-01 19:00:00', '2021-12-01 19:28:00'),


(100, 1, '2021-12-01 19:30:00', '2021-12-01 19:53:00'),


(100, 2, '2021-12-01 21:01:00', '2021-12-01 22:00:00'),


(101, 1, '2021-12-01 19:05:00', '2021-12-01 20:55:00'),


(101, 2, '2021-12-01 21:05:00', '2021-12-01 21:58:00'),


(102, 1, '2021-12-01 19:10:00', '2021-12-01 19:25:00'),


(102, 2, '2021-12-01 19:55:00', '2021-12-01 21:00:00'),


(102, 3, '2021-12-01 21:05:00', '2021-12-01 22:05:00'),


(104, 1, '2021-12-01 19:00:00', '2021-12-01 20:59:00'),


(104, 2, '2021-12-01 21:57:00', '2021-12-01 22:56:00'),


(105, 2, '2021-12-01 19:10:00', '2021-12-01 19:18:00'),


(106, 3, '2021-12-01 19:01:00', '2021-12-01 21:10:00');


1.3 代码实现

select
live_id,
max(user_count) max_user_count
from
(
select
user_id,
live_id,
sum(user_change) over(partition by live_id order by event_time) user_count
from
(
select user_id,
live_id,
in_datetime event_time,
1 user_change
from live_events
union all
select user_id,
live_id,
out_datetime,
-1
from live_events
)t1
)t2
group by live_id;

第2题会话划分问题

2.1 题目需求

现有页面浏览记录表(page_view_events)如下,表中有每个用户的每次页面访问记录。

1686552405752.png

1686552416844.png

规定若同一用户的相邻两次访问记录时间间隔小于60s,则认为两次浏览记录属于同一会话。现有如下需求,为属于同一会话的访问记录增加一个相同的会话id字段,期望结果如下:

1686552433066.png1686552438016.png


2.2 数据准备

1)建表语句

drop table if exists page_view_events;
create table if not exists page_view_events
(
user_id int comment '用户id',
page_id string comment '页面id',
view_timestamp bigint comment '访问时间戳'
)
comment '页面访问记录';

2)数据装载

insert overwrite table page_view_events


values (100, 'home', 1659950435),


(100, 'good_search', 1659950446),


(100, 'good_list', 1659950457),


(100, 'home', 1659950541),


(100, 'good_detail', 1659950552),


(100, 'cart', 1659950563),


(101, 'home', 1659950435),


(101, 'good_search', 1659950446),


(101, 'good_list', 1659950457),


(101, 'home', 1659950541),


(101, 'good_detail', 1659950552),


(101, 'cart', 1659950563),


(102, 'home', 1659950435),


(102, 'good_search', 1659950446),


(102, 'good_list', 1659950457),


(103, 'home', 1659950541),


(103, 'good_detail', 1659950552),


(103, 'cart', 1659950563);


2.3 代码实现

select user_id,
page_id,
view_timestamp,
concat(user_id, '-', sum(session_start_point) over (partition by user_id order by view_timestamp)) session_id
from (
select user_id,
page_id,
view_timestamp,
if(view_timestamp - lagts >= 60, 1, 0) session_start_point
from (
select user_id,
page_id,
view_timestamp,
lag(view_timestamp, 1, 0) over (partition by user_id order by view_timestamp) lagts
from page_view_events
) t1
) t2;

第3题间断连续登录用户问题

3.1 题目需求

现有各用户的登录记录表(login_events)如下,表中每行数据表达的信息是一个用户何时登录了平台。

user_id

login_datetime

100

2021-12-01 19:00:00

100

2021-12-01 19:30:00

100

2021-12-02 21:01:00


现要求统计各用户最长的连续登录天数,间断一天也算作连续,例如:一个用户在1,3,5,6登录,则视为连续6天登录。期望结果如下:

user_id

max_day_count

100

3

101

6

102

3

104

3

105

1


3.2 数据准备

1) 建表语句

drop table if exists login_events;
create table if not exists login_events
(
user_id int comment '用户id',
login_datetime string comment '登录时间'
)
comment '直播间访问记录';

2)数据装载

INSERT overwrite table login_events


VALUES (100, '2021-12-01 19:00:00'),


(100, '2021-12-01 19:30:00'),


(100, '2021-12-02 21:01:00'),


(100, '2021-12-03 11:01:00'),


(101, '2021-12-01 19:05:00'),


(101, '2021-12-01 21:05:00'),


(101, '2021-12-03 21:05:00'),


(101, '2021-12-05 15:05:00'),


(101, '2021-12-06 19:05:00'),


(102, '2021-12-01 19:55:00'),


(102, '2021-12-01 21:05:00'),


(102, '2021-12-02 21:57:00'),


(102, '2021-12-03 19:10:00'),


(104, '2021-12-04 21:57:00'),


(104, '2021-12-02 22:57:00'),


(105, '2021-12-01 10:01:00');


3.3 代码实现

select
user_id,
max(recent_days) max_recent_days --求出每个用户最大的连续天数
from
(
select
user_id,
user_flag,
datediff(max(login_date),min(login_date)) + 1 recent_days --按照分组求每个用户每次连续的天数(记得加1)
from
(
select
user_id,
login_date,
lag1_date,
concat(user_id,'_',flag) user_flag --拼接用户和标签分组
from
(
select
user_id,
login_date,
lag1_date,
sum(if(datediff(login_date,lag1_date)>2,1,0)) over(partition by user_id order by login_date) flag --获取大于2的标签
from
(
select
user_id,
login_date,
lag(login_date,1,'1970-01-01') over(partition by user_id order by login_date) lag1_date --获取上一次登录日期
from
(
select
user_id,
date_format(login_datetime,'yyyy-MM-dd') login_date
from login_events
group by user_id,date_format(login_datetime,'yyyy-MM-dd') --按照用户和日期去重
)t1
)t2
)t3
)t4
group by user_id,user_flag
)t5
group by user_id;6


第4题日期交叉问题

4.1 题目需求

现有各品牌优惠周期表(promotion_info)如下,其记录了每个品牌的每个优惠活动的周期,其中同一品牌的不同优惠活动的周期可能会有交叉。

promotion_id

brand

start_date

end_date

1

oppo

2021-06-05

2021-06-09

2

oppo

2021-06-11

2021-06-21

3

vivo

2021-06-05

2021-06-15


现要求统计每个品牌的优惠总天数,若某个品牌在同一天有多个优惠活动,则只按一天计算。期望结果如下:

brand

promotion_day_count

vivo

17

oppo

16

redmi

22

huawei

22

4.2 数据准备

1)建表语句

drop table if exists promotion_info;
create table promotion_info
(
promotion_id string comment '优惠活动id',
brand string comment '优惠品牌',
start_date string comment '优惠活动开始日期',
end_date string comment '优惠活动结束日期'
) comment '各品牌活动周期表';


2)数据装载

insert overwrite table promotion_info


values (1, 'oppo', '2021-06-05', '2021-06-09'),


(2, 'oppo', '2021-06-11', '2021-06-21'),


(3, 'vivo', '2021-06-05', '2021-06-15'),


(4, 'vivo', '2021-06-09', '2021-06-21'),


(5, 'redmi', '2021-06-05', '2021-06-21'),


(6, 'redmi', '2021-06-09', '2021-06-15'),


(7, 'redmi', '2021-06-17', '2021-06-26'),


(8, 'huawei', '2021-06-05', '2021-06-26'),


(9, 'huawei', '2021-06-09', '2021-06-15'),


(10, 'huawei', '2021-06-17', '2021-06-21');


4.3 代码实现

select
brand,
sum(datediff(end_date,start_date)+1) promotion_day_count
from
(
select
brand,
max_end_date,
if(max_end_date is null or start_date>max_end_date,start_date,date_add(max_end_date,1)) start_date,
end_date
from
(
select
brand,
start_date,
end_date,
max(end_date) over(partition by brand order by start_date rows between unbounded preceding and 1 preceding) max_end_date
from promotion_info
)t1
)t2
where end_date>start_date
group by brand;6
相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
2月前
|
SQL 存储 分布式计算
【万字长文,建议收藏】《高性能ODPS SQL章法》——用古人智慧驾驭大数据战场
本文旨在帮助非专业数据研发但是有高频ODPS使用需求的同学们(如数分、算法、产品等)能够快速上手ODPS查询优化,实现高性能查数看数,避免日常工作中因SQL任务卡壳、失败等情况造成的工作产出delay甚至集群资源稳定性问题。
1028 36
【万字长文,建议收藏】《高性能ODPS SQL章法》——用古人智慧驾驭大数据战场
|
6月前
|
SQL 分布式计算 大数据
大数据新视界 --大数据大厂之Hive与大数据融合:构建强大数据仓库实战指南
本文深入介绍 Hive 与大数据融合构建强大数据仓库的实战指南。涵盖 Hive 简介、优势、安装配置、数据处理、性能优化及安全管理等内容,并通过互联网广告和物流行业案例分析,展示其实际应用。具有专业性、可操作性和参考价值。
大数据新视界 --大数据大厂之Hive与大数据融合:构建强大数据仓库实战指南
|
3月前
|
SQL 分布式计算 大数据
SparkSQL 入门指南:小白也能懂的大数据 SQL 处理神器
在大数据处理的领域,SparkSQL 是一种非常强大的工具,它可以让开发人员以 SQL 的方式处理和查询大规模数据集。SparkSQL 集成了 SQL 查询引擎和 Spark 的分布式计算引擎,使得我们可以在分布式环境下执行 SQL 查询,并能利用 Spark 的强大计算能力进行数据分析。
|
5月前
|
SQL 人工智能 分布式计算
别再只会写SQL了!这五个大数据趋势正在悄悄改变行业格局
别再只会写SQL了!这五个大数据趋势正在悄悄改变行业格局
108 0
|
7月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
8月前
|
SQL 大数据 数据挖掘
玩转大数据:从零开始掌握SQL查询基础
玩转大数据:从零开始掌握SQL查询基础
342 35
|
7月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
8月前
|
SQL 分布式计算 资源调度
Dataphin功能Tips系列(48)-如何根据Hive SQL/Spark SQL的任务优先级指定YARN资源队列
如何根据Hive SQL/Spark SQL的任务优先级指定YARN资源队列
334 4
|
12月前
|
SQL 算法 大数据
为什么大数据平台会回归SQL
在大数据领域,尽管非结构化数据占据了大数据平台80%以上的存储空间,结构化数据分析依然是核心任务。SQL因其广泛的应用基础和易于上手的特点成为大数据处理的主要语言,各大厂商纷纷支持SQL以提高市场竞争力。然而,SQL在处理复杂计算时表现出的性能和开发效率低下问题日益凸显,如难以充分利用现代硬件能力、复杂SQL优化困难等。为了解决这些问题,出现了像SPL这样的开源计算引擎,它通过提供更高效的开发体验和计算性能,以及对多种数据源的支持,为大数据处理带来了新的解决方案。

热门文章

最新文章