现有如下数据,主播id、房间号、播出的批次号,每个批次号进出房间的时间戳、分区时间:

accid room_id batch_id dateline dt
5eb705796a8971881mFJmd 223 1629047963024 1629047965592 08-18
5eb705796a8971881mFJmd 223 1629047963024 1629047975336 08-18
8c15215f733b8e7f1m90uT 264 1629273804000 1629273815723 08-18
8c15215f733b8e7f1m90uT 264 1629273804000 1629274407664 08-18
问题:

每一次直播都有一个上播和下播,每个房间里,同一个批次号会有两条数据,分别记录了上播和下播时间,求每个主播的播出时长?

分析:

通过上面的数据,可以清晰的看出,同一个批次号里面,只要拿后一条时间戳减前一条时间戳就是每个主播的播出时长

我们来看看具体怎么实现:

方法一:

通过row_number()函数,根据主播id、房间号、播出的批次号、分区进行分组,根据时间戳进行排序得到每个主播在每个房间的上播和下播排序数据。拍完序后,怎么拿到后一条时间戳跟前一条时间戳相减呢,那只能自关联,根据排序的序号进行差1关联,取第一条数据。因为我们做了差值关联,只会有第一条数据关联上了后一条时间戳。
查看row_number()函数的语法,可以点击hive分析函数row_number()的应用

spark-sql> with test1 as > (select '5eb705796a8971881mFJmd' as accid,223 as room_id,1629047963024 as batch_id,1629047965 as dateline,'08-18' as dt> union all> select '5eb705796a8971881mFJmd' as accid,223 as room_id,1629047963024 as batch_id,1629047975 as dateline,'08-18' as dt> union all> select '8c15215f733b8e7f1m90uT' as accid,264 as room_id,1629273804000 as batch_id,1629273815 as dateline,'08-18' as dt> union all> select '8c15215f733b8e7f1m90uT' as accid,264 as room_id,1629273804000 as batch_id,1629274407 as dateline,'08-18' as dt)> select >   accid,>   room_id,>   batch_id,>   dateline_end-dateline_start as dateline,>   dt> from > (select >   t1.accid,>   t1.room_id,>   t1.batch_id,>   t1.dateline as dateline_start,>   t2.dateline as dateline_end,>   t1.rank,>   t1.dt> from > (select>   accid,>   room_id,>   batch_id,>   row_number() over(distribute by accid,room_id,batch_id,dt sort by dateline asc) as rank,>   dateline,>   dt> from test1) t1> > left join> (select>   accid,>   room_id,>   batch_id,>   row_number() over(distribute by accid,room_id,batch_id,dt sort by dateline asc) as rank,>   dateline,>   dt> from test1) t2> on t1.accid=t2.accid and t1.room_id=t2.room_id and t1.batch_id=t2.batch_id and t1.rank+1=t2.rank) t3> where t3.rank=1;
5eb705796a8971881mFJmd  223     1629047963024   10      08-18
8c15215f733b8e7f1m90uT  264     1629273804000   592     08-18
Time taken: 12.039 seconds, Fetched 2 row(s)
方法二:

上面通过row_number()函数自关联的方法,逻辑还是很清晰的,但是自关联这种方法在性能的角度来说,并不可取,也不是最优的方法。我们来看看有没有其他的方法呢?既然是取前一条和后一条时间戳,那我们可不可以通过最大值和最小值的方法去做呢?显然是可以的。只要根据主播id、房间号、播出的批次号、分区进行分组,对时间戳取最大值和最小值,那么我们就可以很清楚的知道上播和下播的时间戳了,一相减就是我们想要的播出时长。

spark-sql> with test1 as > (select '5eb705796a8971881mFJmd' as accid,223 as room_id,1629047963024 as batch_id,1629047965 as dateline,'08-18' as dt> union all> select '5eb705796a8971881mFJmd' as accid,223 as room_id,1629047963024 as batch_id,1629047975 as dateline,'08-18' as dt> union all> select '8c15215f733b8e7f1m90uT' as accid,264 as room_id,1629273804000 as batch_id,1629273815 as dateline,'08-18' as dt> union all> select '8c15215f733b8e7f1m90uT' as accid,264 as room_id,1629273804000 as batch_id,1629274407 as dateline,'08-18' as dt)> select >   accid,>   room_id,>   batch_id,>   dateline_end-dateline_start as dateline,>   dt> from > (select>   accid,>   room_id,>   batch_id,>   min(dateline) as dateline_start,>   max(dateline) as dateline_end,>   dt> from test1> group by accid,room_id,batch_id,dt) t1;
5eb705796a8971881mFJmd  223     1629047963024   10      08-18
8c15215f733b8e7f1m90uT  264     1629273804000   592     08-18
Time taken: 4.046 seconds, Fetched 2 row(s)
方法三:

以上两种方法都可以满足我们的需求,但是有没有思考过,有没有这样一个函数通过什么分组啊、排序啊,把后一条时间戳填充到前面来呢?其实是有这样函数的,只是我们不知道而已。
查看这个函数的语法,可以点击hive分析函数lead()和lag()的应用
在这里怎么用呢?lead() over()函数根会据时间排序把后一条时间戳填充到前面来形成一个新的字段。我们通过row_number()函数正序,lead() over()函数也正序,那么后一条时间戳正好会填充到第一条时间戳后面,取第一条数据就是完整的上下播了,再根据两个时间戳相减就可以得到主播的播出时长了。

spark-sql> with test1 as > (select '5eb705796a8971881mFJmd' as accid,223 as room_id,1629047963024 as batch_id,1629047965 as dateline,'08-18' as dt> union all> select '5eb705796a8971881mFJmd' as accid,223 as room_id,1629047963024 as batch_id,1629047975 as dateline,'08-18' as dt> union all> select '8c15215f733b8e7f1m90uT' as accid,264 as room_id,1629273804000 as batch_id,1629273815 as dateline,'08-18' as dt> union all> select '8c15215f733b8e7f1m90uT' as accid,264 as room_id,1629273804000 as batch_id,1629274407 as dateline,'08-18' as dt)> select >   accid,>   room_id,>   batch_id,>   dateline_end-dateline_start as dateline,>   dt> from > (select>   accid,>   room_id,>   batch_id,>   row_number() over(distribute by accid,room_id,batch_id,dt sort by dateline asc) as rank,>   dateline as dateline_start,>   lead(dateline,1) over(distribute by accid,room_id,batch_id,dt sort by dateline asc) as dateline_end,>   dt> from test1) t1> where t1.rank=1;
5eb705796a8971881mFJmd  223     1629047963024   10      08-18
8c15215f733b8e7f1m90uT  264     1629273804000   592     08-18
Time taken: 6.558 seconds, Fetched 2 row(s)
总结:

在三种方法都满足需求的时候,你会选择那种方法呢?
方法一:在我们没有什么思路的时候,只要这个方法能实现,也不失为一个好方法啊
方法二:对于这种一个头一个尾的需求,这种方法确实是一个很特殊,很有格调的方法,很简洁
方法三:运用了两个分析函数,很有逼格。这种方法对于求上播、下播的播出时长、用户的页面停留时长以及需要上一条和下一条数据做差值的时候,会更加灵活,方便

所以你会选择哪种方法呢?

关注博主,你会看到更多、更精彩的大数据知识

hive经典面试题1--根据主播上播、下播时间戳求播出时长相关推荐

  1. Hive经典面试题——级联求和(访客访问统计报表)

    在大数据面试中,Hive知识的考察大部分会问级联求和,业务场景虽然有很多种,比如说,年收入,月收入统计:访客访问次数年统计,月统计.等等.但是基本根源知识是级联求和,本文就以访客访问统计为例. 1.基 ...

  2. hive经典面试题4--如何用分时数据计算分时累计数据?如何在分时累计数据为空的时候去补全数据?

    背景: 在互联网公司经常会用每10分钟为维度去统计某一个指标,这种统计我们称为分时数据.例如10分钟内某个渠道的安装数据,通过这个数据可以实时查看这个渠道质量好坏,如果这个渠道质量不行,那么就停止投放 ...

  3. hive经典面试题2--次日留存、3日、7日留存怎么计算

    背景:互联网公司,分析app上线后的效果,通常会通过很多指标来分析,其中一个指标就是留存率,留存率中最重要的就是次日留存,如果次日留存很高,说明这个app很成功,用户粘性高. 留存是怎么定义的呢? 一 ...

  4. [剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]

    [问题描述][中等] 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3 ...

  5. [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]

    [问题描述][简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行.例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 ...

  6. [剑指offer][JAVA]面试题第[32-1]题[从上到下打印二叉树][BFS]

    [问题描述][中等] 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回: ...

  7. 【剑指offer】面试题32 - III:从上到下打印二叉树 III(Java)

    请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3,9,20,null, ...

  8. 【剑指offer】面试题32 - II:从上到下打印二叉树 II(Java)

    从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3    / \   9  20     /  \ ...

  9. 【剑指offer】面试题32 - I:从上到下打印二叉树(Java)

    从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3    / \   9  20     /  \     ...

  10. 剑指offer编程试题Java实现--22.从上往下打印二叉树

    个人博客:小景哥哥 22.从上往下打印二叉树 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. import java.util.ArrayList; import java.util ...

最新文章

  1. h5MYSQL并进行增删查改_mysql增删改查
  2. 如何解决某个端口被谁占用?
  3. linux java的启动内存溢出,java - Java的R代码可在Linux上运行,但不能在Windows中运行 - 堆栈内存溢出...
  4. P4309 [TJOI2013]最长上升子序列 平衡树 + dp
  5. 如何找到python的安装路径_如何查看python的安装路径
  6. dz论坛修改html编辑器,discuz二次开发更换百度ueditor编辑器
  7. 建立高端人脉的三条捷径
  8. shop++源码反编译----随笔
  9. 最主流的Java后台开发框架
  10. Python优化算法07——布谷鸟搜索算法
  11. Python爬取IMDB TOP 250 电影榜单
  12. 数据分析细数周杰伦不能说的秘密
  13. 天津工业大学计算机学院调剂信息,天津工业大学2019年硕士研究生调剂公告
  14. 我的世界服务器自定义怪物怎么用,我的世界自定义怪物插件
  15. 第八章 字符串和字符串函数
  16. 磁盘分区形式:主启动记录(MBR)和全局唯一标识分区表(GPT)
  17. 算法工程师应该具备哪些工程能力
  18. Android 生成自己的签名key(releasekey platform shared media networkstack verify等)
  19. kubernetes安装配置
  20. 医学图像的一些预处理知识

热门文章

  1. 公众号推送长图最佳尺寸_微信公众平台图片尺寸是多少
  2. 学位论文写作规范之论文选题、开题报告、毕业论文
  3. POJ3764 字典树
  4. 面试经验之阿里暑期实习
  5. A3文件转换成A4文件
  6. (BFS/状态压缩)HDU 5025 Saving Tang Monk
  7. 官网版本的windows pe系统启动盘制作过程
  8. 计算机专业英语 9次作业合集 从第九次到第一次
  9. Word删除指定一页的页码
  10. 钽电容失效、爆炸、烧毁的种种原因!