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

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务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的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
2月前
|
存储 机器学习/深度学习 分布式计算
大数据技术——解锁数据的力量,引领未来趋势
【10月更文挑战第5天】大数据技术——解锁数据的力量,引领未来趋势
|
26天前
|
存储 机器学习/深度学习 SQL
大数据处理与分析技术
大数据处理与分析技术
87 2
|
2月前
|
存储 分布式计算 数据可视化
大数据常用技术与工具
【10月更文挑战第16天】
146 4
|
28天前
|
存储 分布式计算 NoSQL
【赵渝强老师】大数据技术的理论基础
本文介绍了大数据平台的核心思想,包括Google的三篇重要论文:Google文件系统(GFS)、MapReduce分布式计算模型和BigTable大表。这些论文奠定了大数据生态圈的技术基础,进而发展出了Hadoop、Spark和Flink等生态系统。文章详细解释了GFS的架构、MapReduce的计算过程以及BigTable的思想和HBase的实现。
|
2月前
|
存储 数据采集 监控
大数据技术:开启智能决策与创新服务的新纪元
【10月更文挑战第5天】大数据技术:开启智能决策与创新服务的新纪元
|
7天前
|
SQL 运维 大数据
轻量级的大数据处理技术
现代大数据应用架构中,数据中心作为核心,连接数据源与应用,承担着数据处理与服务的重要角色。然而,随着数据量的激增,数据中心面临运维复杂、体系封闭及应用间耦合性高等挑战。为缓解这些问题,一种轻量级的解决方案——esProc SPL应运而生。esProc SPL通过集成性、开放性、高性能、数据路由和敏捷性等特性,有效解决了现有架构的不足,实现了灵活高效的数据处理,特别适用于应用端的前置计算,降低了整体成本和复杂度。
|
14天前
|
SQL 算法 大数据
为什么大数据平台会回归SQL
在大数据领域,尽管非结构化数据占据了大数据平台80%以上的存储空间,结构化数据分析依然是核心任务。SQL因其广泛的应用基础和易于上手的特点成为大数据处理的主要语言,各大厂商纷纷支持SQL以提高市场竞争力。然而,SQL在处理复杂计算时表现出的性能和开发效率低下问题日益凸显,如难以充分利用现代硬件能力、复杂SQL优化困难等。为了解决这些问题,出现了像SPL这样的开源计算引擎,它通过提供更高效的开发体验和计算性能,以及对多种数据源的支持,为大数据处理带来了新的解决方案。
|
15天前
|
机器学习/深度学习 存储 大数据
在大数据时代,高维数据处理成为难题,主成分分析(PCA)作为一种有效的数据降维技术,通过线性变换将数据投影到新的坐标系
在大数据时代,高维数据处理成为难题,主成分分析(PCA)作为一种有效的数据降维技术,通过线性变换将数据投影到新的坐标系,保留最大方差信息,实现数据压缩、去噪及可视化。本文详解PCA原理、步骤及其Python实现,探讨其在图像压缩、特征提取等领域的应用,并指出使用时的注意事项,旨在帮助读者掌握这一强大工具。
32 4
|
22天前
|
机器学习/深度学习 存储 大数据
云计算与大数据技术的融合应用
云计算与大数据技术的融合应用
|
28天前
|
SQL 存储 算法
比 SQL 快出数量级的大数据计算技术
SQL 是大数据计算中最常用的工具,但在实际应用中,SQL 经常跑得很慢,浪费大量硬件资源。例如,某银行的反洗钱计算在 11 节点的 Vertica 集群上跑了 1.5 小时,而用 SPL 重写后,单机只需 26 秒。类似地,电商漏斗运算和时空碰撞任务在使用 SPL 后,性能也大幅提升。这是因为 SQL 无法写出低复杂度的算法,而 SPL 提供了更强大的数据类型和基础运算,能够实现高效计算。