大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题
大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题
之后会不定期更新每日一题sql系列。
SQL面试题每日一题系列内容均来自于网络以及实际使用情况收集,如有雷同,纯属巧合。
1.题目
问题1:如下为某直播平台各主播的开播及关播时间数据明细,现在需要计算该平台最高峰期同时在线的主播人数。
问题2:以下为某直播间用户上线与下线的时间数据明细,现求该直播间最高峰同时在线的用户人数。
以上两个问法为同一问题。
2.基础数据准备
create table if not exists temp.user_login_info (
`id` bigint comment '用户id',
`start_time` string comment '上线时间',
`end_time` string comment '下线时间'
) comment '用户上下线时间测试'
数据预览
id | start_time | end_time |
---|---|---|
1 | 2024-05-05 07:59:06 | 2024-05-05 08:57:54 |
2 | 2024-05-05 08:14:02 | 2024-05-05 08:51:32 |
3 | 2024-05-05 08:38:10 | 2024-05-05 08:38:28 |
4 | 2024-05-05 08:41:22 | 2024-05-05 08:42:03 |
5 | 2024-05-05 08:33:39 | 2024-05-05 08:52:19 |
6 | 2024-05-05 08:54:50 | 2024-05-05 08:56:07 |
7 | 2024-05-05 08:56:12 | 2024-05-05 08:57:42 |
8 | 2024-05-05 08:21:43 | 2024-05-05 08:21:48 |
9 | 2024-05-05 07:59:58 | 2024-05-05 08:13:42 |
10 | 2024-05-05 08:20:05 | 2024-05-05 08:29:42 |
3.问题分析
查询同时最大人数,考察的是对拉链转化为日志的处理方式以及聚合开窗函数的累积计算的使用。聚合开窗函数使用详见SQL窗口函数之聚合函数类
维度 | 评分 |
---|---|
题目难度 | ️️️️ |
题目清晰度 | ️️️️️ |
业务常见度 | ️️️️️ |
4.解题SQL
1.生成日志流水
对原始数据进行处理,生成主播上下线的日志流水数据,增加标记状态值(上线为1,下线为-1)。
-- 上播记录
select
id,
start_time as log_time,
1 as flag
from temp.user_login_info
union all
-- 下播记录
select
id,
end_time as log_time,
-1 as flag
from temp.user_login_info
数据结果如下:
id | log_time | flag |
---|---|---|
1 | 2024-05-05 08:57:54 | -1 |
2 | 2024-05-05 08:51:32 | -1 |
3 | 2024-05-05 08:38:28 | -1 |
4 | 2024-05-05 08:42:03 | -1 |
5 | 2024-05-05 08:52:19 | -1 |
6 | 2024-05-05 08:56:07 | -1 |
7 | 2024-05-05 08:57:42 | -1 |
8 | 2024-05-05 08:21:48 | -1 |
9 | 2024-05-05 08:13:42 | -1 |
10 | 2024-05-05 08:29:42 | -1 |
1 | 2024-05-05 07:59:06 | 1 |
2 | 2024-05-05 08:14:02 | 1 |
3 | 2024-05-05 08:38:10 | 1 |
4 | 2024-05-05 08:41:22 | 1 |
5 | 2024-05-05 08:33:39 | 1 |
6 | 2024-05-05 08:54:50 | 1 |
7 | 2024-05-05 08:56:12 | 1 |
8 | 2024-05-05 08:21:43 | 1 |
9 | 2024-05-05 07:59:58 | 1 |
10 | 2024-05-05 08:20:05 | 1 |
2.开窗函数聚合
对上下线日志流水进行开窗聚合累积计算且查看上下线明细。
select id,log_time,flag,sum(flag) over(order by log_time) as acum_login from (
-- 上播记录
select
id,
start_time as log_time,
1 as flag
from temp.user_login_info where id <= 10
union all
-- 下播记录
select
id,
end_time as log_time,
-1 as flag
from temp.user_login_info where id <= 10
) a
order by log_time
数据结果
id | log_time | flag | acum_login |
---|---|---|---|
1 | 2024-05-05 07:59:06 | 1 | 1 |
9 | 2024-05-05 07:59:58 | 1 | 2 |
9 | 2024-05-05 08:13:42 | -1 | 1 |
2 | 2024-05-05 08:14:02 | 1 | 2 |
10 | 2024-05-05 08:20:05 | 1 | 3 |
8 | 2024-05-05 08:21:43 | 1 | 4 |
8 | 2024-05-05 08:21:48 | -1 | 3 |
10 | 2024-05-05 08:29:42 | -1 | 2 |
5 | 2024-05-05 08:33:39 | 1 | 3 |
3 | 2024-05-05 08:38:10 | 1 | 4 |
3 | 2024-05-05 08:38:28 | -1 | 3 |
4 | 2024-05-05 08:41:22 | 1 | 4 |
4 | 2024-05-05 08:42:03 | -1 | 3 |
2 | 2024-05-05 08:51:32 | -1 | 2 |
5 | 2024-05-05 08:52:19 | -1 | 1 |
6 | 2024-05-05 08:54:50 | 1 | 2 |
6 | 2024-05-05 08:56:07 | -1 | 1 |
7 | 2024-05-05 08:56:12 | 1 | 2 |
7 | 2024-05-05 08:57:42 | -1 | 1 |
1 | 2024-05-05 08:57:54 | -1 | 0 |
3.计算最大在线人数
最后计算最大同时在线人数
select max(acum_login) as max_acum_login from (
select id,log_time,flag,sum(flag) over(order by log_time) as acum_login from (
select
id,
start_time as log_time,
1 as flag
from temp.user_login_info where id <= 10
union all
--下播记录
select
id,
end_time as log_time,
-1 as flag
from temp.user_login_info where id <= 10
) a
) b
数据结果
max_acum_login |
---|
4 |
最大在线人数为4。
5.衍生问题解答
如果是最上面的问题2,每个房间同时在线最大人数呢?
那它的写法应该是这样的。
select room_id,max(acum_login) as max_acum_login from (
select id,room_id
,log_time,flag
,sum(flag) over(partition by room_id order by log_time) as acum_login
from (
-- 上线记录
select
id,room_id,
start_time as log_time,
1 as flag
from temp.user_login_info where id <= 10
union all
-- 下线记录
select
id,room_id,
end_time as log_time,
-1 as flag
from temp.user_login_info where id <= 10
) a
) b
group by room_id
就不补充具体数据演示了。
思路:以第一个问题为基础,这里只是多增加了一个房间维度,按房间分组进行开窗聚合累积计算以及最后的分组求最大值。如有问题,欢迎联系我点击此处加群一起学习讨论。
以上,本期全部内容。
感谢阅读。
按例,欢迎点击此处关注我的个人公众号,交流更多知识。
大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题的更多相关文章
- 面试系列二:精选大数据面试真题JVM专项-附答案详细解析
公众号(五分钟学大数据)已推出大数据面试系列文章-五分钟小面试,此系列文章将会深入研究各大厂笔面试真题,并根据笔面试题扩展相关的知识点,助力大家都能够成功入职大厂! 大数据笔面试系列文章分为两种类型: ...
- MYSQL数据库导入大数据量sql文件失败的解决方案
1.在讨论这个问题之前首先介绍一下什么是"大数据量sql文件". 导出sql文件.选择数据库-----右击选择"转储SQL文件"-----选择"结构和 ...
- 以慕课网日志分析为例-进入大数据Spark SQL的世界
下载地址.请联系群主 第1章 初探大数据 本章将介绍为什么要学习大数据.如何学好大数据.如何快速转型大数据岗位.本项目实战课程的内容安排.本项目实战课程的前置内容介绍.开发环境介绍.同时为大家介绍项目 ...
- 以某课网日志分析为例 进入大数据 Spark SQL 的世界
第1章 初探大数据 本章将介绍为什么要学习大数据.如何学好大数据.如何快速转型大数据岗位.本项目实战课程的内容安排.本项目实战课程的前置内容介绍.开发环境介绍.同时为大家介绍项目中涉及的Hadoop. ...
- 【慕课网实战】一、以慕课网日志分析为例 进入大数据 Spark SQL 的世界
课程整套CDH相关的软件下载地址:http://archive.cloudera.com/cdh5/cdh/5/ cdh-5.7.0 生产或者测试环境选择对应CDH版本时,一定要采用尾号是一样的版本 ...
- 【大数据面试】【项目开发经验】Hadoop、Flume、Kafka、Hive、MySQL、Sqoop、Azkaban、Spark
主要内容:框架层面的调优.业务经验 一.Hadoop 1.Hadoop基准测试(HDFS的读写性能.MapReduce的计算能力测试) (1)测试内容:文件上传下载的时间 (2)服务器有几个硬盘插槽 ...
- 如何在IDEA里给大数据项目导入该项目的相关源码(博主推荐)(类似eclipse里同一个workspace下单个子项目存在)(图文详解)
不多说,直接上干货! 如果在一个界面里,可以是单个项目 注意:本文是以gradle项目的方式来做的! 如何在IDEA里正确导入从Github上下载的Gradle项目(含相关源码)(博主推荐)(图文详解 ...
- [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...
- 【大数据面试】Flink 04:状态编程与容错机制、Table API、SQL、Flink CEP
六.状态编程与容错机制 1.状态介绍 (1)分类 流式计算分为无状态和有状态 无状态流针对每个独立事件输出结果,有状态流需要维护一个状态,并基于多个事件输出结果(当前事件+当前状态值) (2)有状态计 ...
- 【慕课网实战】九、以慕课网日志分析为例 进入大数据 Spark SQL 的世界
即席查询普通查询 Load Data1) RDD DataFrame/Dataset2) Local Cloud(HDFS/S3) 将数据加载成RDDval masterLog = sc.textFi ...
随机推荐
- 新零售SaaS架构:客户管理系统的应用架构设计
客户管理系统的应用架构设计 应用层定义了软件系统的应用功能,负责接收用户的请求,协调领域层能力来执行任务,并将结果返回给用户,功能模块包括: 客户管理:核心功能模块,负责收集和更新客户信息,包括个人资 ...
- Scala 不可变数组Array
1 package chapter07 2 3 object Test01_ImmutableArray { 4 def main(args: Array[String]): Unit = { 5 / ...
- JDBC复习:创建MySQL数据表
1 try { 2 conn=JDBCUtil.getConnection(); 3 preparedStatement = conn.prepareStatement(DROP_TABLE_1); ...
- 【已解决】(MySQL)SQL注入绕过登陆验证直接登陆---用户名输入框注释sql密码语句段
今天学习了一种sql注入方法,通过注释密码验证部分的sql语句. 这是登陆界面 在用户名如果输入 15284206891' and 1=1 # 密码可以随意输入即可登陆成功 原理如下: 在sql可视化 ...
- [Unity3D] 使用LineRenderer实现尾迹与虚线效果
Unity3D 使用LineRenderer绘制尾迹与虚线 1.添加LineRenderer组件 先创建一个3D对象,然后点击Add Component选项 搜索并添加LineRenderer组件 添 ...
- CH395的FTP Server(主动模式)简单应用参考
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一.FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端.本篇文章将基于FTP协议 ...
- #线性dp#洛谷 5999 [CEOI2016]kangaroo
题目 问有多少个长度为 \(n\) 的排列满足首项为 \(st\),末项为 \(ed\), 并且 \(\forall i\in (1,n),\left[a_{i-1}<a_i \oplus a_ ...
- Python查询上周五是多少号
使用Python可以轻松的查询出上周几是多少号,这周几是什么多少号,以下是查询上周五的示例: import datetime, calendar last = datetime.date.today( ...
- NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解
NL2SQL进阶系列(1):DB-GPT-Hub.SQLcoder.Text2SQL开源应用实践详解 NL2SQL基础系列(1):业界顶尖排行榜.权威测评数据集及LLM大模型(Spider vs BI ...
- CentOS 9 Basic Developing environment and IDEs installing guide
I . Install Google Chrome browser Check the installed chrome and related packages with the command & ...