hive经典面试题4--如何用分时数据计算分时累计数据?如何在分时累计数据为空的时候去补全数据?
背景:
在互联网公司经常会用每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:20
到00: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--如何用分时数据计算分时累计数据?如何在分时累计数据为空的时候去补全数据?相关推荐
- Hive经典面试题——级联求和(访客访问统计报表)
在大数据面试中,Hive知识的考察大部分会问级联求和,业务场景虽然有很多种,比如说,年收入,月收入统计:访客访问次数年统计,月统计.等等.但是基本根源知识是级联求和,本文就以访客访问统计为例. 1.基 ...
- hive经典面试题2--次日留存、3日、7日留存怎么计算
背景:互联网公司,分析app上线后的效果,通常会通过很多指标来分析,其中一个指标就是留存率,留存率中最重要的就是次日留存,如果次日留存很高,说明这个app很成功,用户粘性高. 留存是怎么定义的呢? 一 ...
- Hive SQL经典面试题:统计连续登陆的三天及以上的用户
Hive SQL经典面试题 最近发现一道大数据面试经常会问的SQL题目:统计连续登录的三天及以上的用户(或者类似的:连续3个月充值会员用户.连续N天购买商品的用户等),下面就来记录一下解题思路. 要求 ...
- Hive SQL 五大经典面试题
目录 第 1 题 连续问题 分析: 解法: 第 2 题 分组问题 分析: 解法: 第 3 题 间隔连续问题 分析: 解法: 第 4 题 打折日期交叉问题 分析: 解法: 第 5 题 同时在线问题 分析 ...
- [ZZ]知名互联网公司Python的16道经典面试题及答案
知名互联网公司Python的16道经典面试题及答案 https://mp.weixin.qq.com/s/To0kYQk6ivYL1Lr8aGlEUw 知名互联网公司Python的16道经典面试题及答 ...
- Java开发经典面试题分享,建议收藏
今天分享一篇Java开发的经典面试题,一起来看看吧! 1.SpringMVC的工作流程? (1)用户发送请求至前端控制器DispatcherServlet (2)DispatcherServlet收到 ...
- 测试电梯的测试用例_测试用例设计经典面试题
测试用例设计经典面试题之电梯.杯子.笔.桌子.洗衣机.椅子.ATM等按测试的类型逐一测试测试类型主要分为:界面测试.性能测试(压力测试).安全测试.兼容性测试几个方向. 1.测试项目:电梯 需求测试: ...
- 网易校园招聘历年经典面试题汇总:前端 岗
这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 这个系列离结束差的还特别多,会更新涵盖所有一线大厂的所有岗位,也可以关注一下. 腾讯校园招聘历年经典面试题汇总:前 ...
- 百度校招历年经典面试题汇总:Java开发岗
这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 这个系列离结束差的还特别多,会更新涵盖所有一线大厂的所有岗位,也可以关注一下. 百度校园招聘历年经典面试题汇总:C ...
最新文章
- Spring Cloud Stream消费失败后的处理策略(二):自定义错误处理逻辑
- 极客Web前端开发资源大荟萃#017
- 第五周-第11章节-Python3.5-内置模块详解之Xml模块
- Android创建数据表和LitePal的基本用法
- php 设置断点,PHP xdebug安装配置(支持断点调试)
- 在LINQ to SQL中使用Translate方法以及修改查询用SQL
- CCNP精粹系列之十七--路由映射实战,博主推荐
- DB2 改变日期格式
- MySQL主从同步的多种模式
- jemalloc java_jemalloc源码结构分析
- 旅游B2B2C系统解决方案
- correspondence analysis of drug and genotype(spss)
- 【基础常识】什么是字符以及字符串的定义
- 为帮助建筑和设施管理者满足保持社交距离的需求,Bentley 软件公司开放对 LEGION Simulator 和 OpenBuildings Station Designer 的完全访问权限,并在
- 联想y450安装黑苹果
- 品牌笔记本主板刷BIOS升级NVME ssd启动系统
- Django DTL模板使用
- 基于MAC地址划分VLAN
- access统计班级人数_[access查询]access查询分段统计人数
- mysql 存储类型文本最大长度longtext