背景:
在互联网公司经常会用每10分钟为维度去统计某一个指标,这种统计我们称为分时数据。例如10分钟内某个渠道的安装数据,通过这个数据可以实时查看这个渠道质量好坏,如果这个渠道质量不行,那么就停止投放,避免不必要的损失。有时候会用每10分钟累计一次(我们称为分时累计数据),通过折线图去看这个数据的走势。

分时累计数据: 例如,00:00-00:10累计一次,00:00-00:20累计一次,00:00-00:30累计一次,每隔10分钟累计一次,这就是我们所说的分时累计数据。

那么问题来了,如何用分时数据计算分时累计数据呢?

有如下分时数据(将时间戳格式化成HH:mm)(可以累加的pv数据,如果涉及到uv是不可以累加的),怎么去统计每10分的累计数据呢?
说到累计,我们很容易就想到了sum() over()这个函数

apptypeid hh num
1001 00:10 8
1001 00:20 7
1001 00:40 6
1001 00:50 10
1001 01:00 12

计算逻辑如下:

spark-sql> with test_hh as > (select > '1001' as apptypeid,'00:10' as hh,8 as num> union all> select '1001' as apptypeid,'00:20' as hh,7 as num> union all> select '1001' as apptypeid,'00:40' as hh,6 as num> union all> select '1001' as apptypeid,'00:50' as hh,10 as num> union all> select '1001' as apptypeid,'01:00' as hh,12 as num> )> select >   apptypeid,>   hh,>   num,>   sum(num) over(distribute by apptypeid sort by hh) as num_total> from test_hh;
1001    00:10       8       8
1001    00:20       7       15
1001    00:40       6       21
1001    00:50       10      31
1001    01:00       12      43
Time taken: 2.864 seconds, Fetched 5 row(s)

通过上面的结果,我们可以看出num_total这一列值,是累加后的结果。但是这个结果在展示的时候,就会出现上面图中的情况,从00:2000:40中间的点会断,就会出现直线向下的现象。

怎么去解决这个问题?

那我们是不是在00:30这个点去补一条数据就可以了,那怎么补呢?补什么数据呢?
如果我们把00:30这个点补一个0,去参与累加计算是不是就不会出现中间断点的情况了,而且不会影响最终的累加结果。

apptypeid hh num
1001 00:10 8
1001 00:20 7
1001 00:30 0
1001 00:40 6
1001 00:50 10
1001 01:00 12
那问题又来了,我们怎么知道要补哪个点呢?

我们出一个所有点的配置表,给每个点一个默认值0,再去关联我们的数据,如果关联不上的用我们的默认值给填充,上代码:
with的用法点击此处

spark-sql> with test_hh as > (select > '1001' as apptypeid,'00:10' as hh,8 as num> union all> select '1001' as apptypeid,'00:20' as hh,7 as num> union all> select '1001' as apptypeid,'00:40' as hh,6 as num> union all> select '1001' as apptypeid,'00:50' as hh,10 as num> union all> select '1001' as apptypeid,'01:00' as hh,12 as num> ),> --所有分时的配置表> test_hh_config as > (select > '1001' as apptypeid,'00:10' as hh> union all> select '1001' as apptypeid,'00:20' as hh> union all> select '1001' as apptypeid,'00:30' as hh> union all> select '1001' as apptypeid,'00:40' as hh> union all> select '1001' as apptypeid,'00:50' as hh> union all> select '1001' as apptypeid,'01:00' as hh> )> select >   apptypeid,>   hh,>   num,>   sum(num) over(distribute by apptypeid sort by hh) as num_total> from > (select >   apptypeid,>   hh,>   max(num) as num> from > (select >   apptypeid,>   hh,>   0 as num> from test_hh_config> > union all> select >   apptypeid,>   hh,>   num> from test_hh) t1> group by apptypeid,hh) t2;
1001    00:10       8       8
1001    00:20       7       15
1001    00:30       0       15
1001    00:40       6       21
1001    00:50       10      31
1001    01:00       12      43
Time taken: 14.713 seconds, Fetched 6 row(s)

通过分时的配置表给00:30这个点,填充了一个默认值0,正好符合我们不影响累加数据结果的要求。在页面上显示的时候,也会是趋于平滑的曲线。

注意: 上面我们在关联的时候,用了union all,这个在大表关联跑不动或者内存溢出的时候,是非要有效的,也是面试经常要问的。可查看五种去重方式

问题延伸:

在实际线业务上,我们会有很多维度,例如渠道、版本、操作系统、新老用户等等一些列维度。如果去补这种多维度的分时累计的点怎么补呢?
这个时候我们就要将所有的分时数据出一张配置表,再将我们所有去重后的维度数据,跟这个分时的配置表去笛卡尔积,保证每个交叉维度,有所有的分时点,这样去关联实际数据的时候才不会出现丢失点的问题。
逻辑如下:

selectt1.apptypeid,t1.type,t1.os,t1.qid,t1.ver,t1.isnew,t2.hh,t1.dt
from
(select apptypeid,type,os,qid,ver,isnew,dt
from test.test_data_detail
where dt='vardate'
group by apptypeid,type,os,qid,ver,isnew,dt) t1cross join
(select hh
from config_center.config_hh_minute) t2;

小伙伴在实际生产中,有出现类似问题,可以给博主留言

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

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

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

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

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

  3. Hive SQL经典面试题:统计连续登陆的三天及以上的用户

    Hive SQL经典面试题 最近发现一道大数据面试经常会问的SQL题目:统计连续登录的三天及以上的用户(或者类似的:连续3个月充值会员用户.连续N天购买商品的用户等),下面就来记录一下解题思路. 要求 ...

  4. Hive SQL 五大经典面试题

    目录 第 1 题 连续问题 分析: 解法: 第 2 题 分组问题 分析: 解法: 第 3 题 间隔连续问题 分析: 解法: 第 4 题 打折日期交叉问题 分析: 解法: 第 5 题 同时在线问题 分析 ...

  5. [ZZ]知名互联网公司Python的16道经典面试题及答案

    知名互联网公司Python的16道经典面试题及答案 https://mp.weixin.qq.com/s/To0kYQk6ivYL1Lr8aGlEUw 知名互联网公司Python的16道经典面试题及答 ...

  6. Java开发经典面试题分享,建议收藏

    今天分享一篇Java开发的经典面试题,一起来看看吧! 1.SpringMVC的工作流程? (1)用户发送请求至前端控制器DispatcherServlet (2)DispatcherServlet收到 ...

  7. 测试电梯的测试用例_测试用例设计经典面试题

    测试用例设计经典面试题之电梯.杯子.笔.桌子.洗衣机.椅子.ATM等按测试的类型逐一测试测试类型主要分为:界面测试.性能测试(压力测试).安全测试.兼容性测试几个方向. 1.测试项目:电梯 需求测试: ...

  8. 网易校园招聘历年经典面试题汇总:前端 岗

    这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 这个系列离结束差的还特别多,会更新涵盖所有一线大厂的所有岗位,也可以关注一下. 腾讯校园招聘历年经典面试题汇总:前 ...

  9. 百度校招历年经典面试题汇总:Java开发岗

    这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 这个系列离结束差的还特别多,会更新涵盖所有一线大厂的所有岗位,也可以关注一下. 百度校园招聘历年经典面试题汇总:C ...

最新文章

  1. Spring Cloud Stream消费失败后的处理策略(二):自定义错误处理逻辑
  2. 极客Web前端开发资源大荟萃#017
  3. 第五周-第11章节-Python3.5-内置模块详解之Xml模块
  4. Android创建数据表和LitePal的基本用法
  5. php 设置断点,PHP xdebug安装配置(支持断点调试)
  6. 在LINQ to SQL中使用Translate方法以及修改查询用SQL
  7. CCNP精粹系列之十七--路由映射实战,博主推荐
  8. DB2 改变日期格式
  9. MySQL主从同步的多种模式
  10. jemalloc java_jemalloc源码结构分析
  11. 旅游B2B2C系统解决方案
  12. correspondence analysis of drug and genotype(spss)
  13. 【基础常识】什么是字符以及字符串的定义
  14. 为帮助建筑和设施管理者满足保持社交距离的需求,Bentley 软件公司开放对 LEGION Simulator 和 OpenBuildings Station Designer 的完全访问权限,并在
  15. 联想y450安装黑苹果
  16. 品牌笔记本主板刷BIOS升级NVME ssd启动系统
  17. Django DTL模板使用
  18. 基于MAC地址划分VLAN
  19. access统计班级人数_[access查询]access查询分段统计人数
  20. mysql 存储类型文本最大长度longtext

热门文章

  1. CMOS 图像传感器——Skipping 和 Binning 模式
  2. 【Java】1-100之间所有自然数的和(while和for方法)
  3. 2万元小投资冷门暴利行业有哪些?投资什么利润大?
  4. win10系统解决cmd不是默认管理员打开的办法
  5. 基于 librdkafka C API 的三种seek随机访问方法
  6. flash不是html标签,Flash中所支持的Html标签
  7. 『JWT』有人让你赶快用它,有人劝你放弃它
  8. 网络炸飞机 v1.20 官方
  9. MD5 加密已被破解
  10. 电子签名并加水印处理