Hive实现时间滑动窗口计算
Hive实现时间滑动窗口计算
- 时间滑动计算
- 外部调用实现时间循环
- 自关联实现滑动时间窗口
- 扩展基于自然周的的滚动时间窗口计算
- 总结
时间滑动计算
需求大致是这样的,我们有一个业务涉及到用户打卡,用户可以一天多次打卡,我们希望计算出7天内打卡8次以上,且打卡时间分布在4天以上的时间
具体解释一下这个需求
用户一天可以打卡多次,所以要求打卡必须分布在4天以上;
7天不是一个自然周,而是某一天和接下来的6天,也就是说时间是是滑动的,窗口大小是7,步长是1,说白了就是窗口计算;
其实说到这里你就想到了窗口函数,虽然这是一个窗口;但是hive却没有相应的窗口函数可以计算,接下来看一下怎么实现这个逻辑
外部调用实现时间循环
我们可以先写这样的一个SQL,就计算每个人在特定时间内是否满足我们的条件,我们先计算出每个人每天的打卡次数,例如这里我们的时间限制是’20210701’ 到’20210707’
selectunion_id,to_date(ds,'yyyymmdd') as dt,count(1) as cnt
fromods_la_daily_record_di
where-- 驱动表的时间限制ds>='${begin_bizdate}' and ds<= '${end_bizdate}'
group byunion_id, ds
然后我们再判断这个时间端内,用户的打卡情况是否满足我们的条件
selectt1.union_id,count(1) as '打卡天数',sum(t1.cnt) as '打卡次数'
from
(selectunion_id,to_date(ds,'yyyymmdd') as dt,count(1) as cntfromods_la_daily_record_diwhere-- 驱动表的时间限制ds>='${begin_bizdate}' and ds<= '${end_bizdate}'group byunion_id, ds
) as t1
group byt1.union_id
having-- 时间分布在4天以上count(1)>=4-- 打卡次数在8次以上and sum(t1.cnt)>=8
;
这样我们就算出来我们需要的数据,接下来我们只需要用其他语言调用这个SQL,传入不同的时间参数就可以了,利用编程语言实现时间的滑动,例如第一次传入’20210701-20210707
’ 第二次传入’20210702-20210708
’ 以此传入即可。
虽然可以实现,但是不好,因为我们还需要其他语言的调用,其实我们知道在SQL里面的关联其实就是通过循环实现的,那我们即然能通过循环实现这个需求,我们能不能通过关联实现这个需求呢
自关联实现滑动时间窗口
其实我们只要让用户某一天的数据和他接下来的6天的数据关联,然后按照这一天的数据进行汇总然后判断时候满足我们的条件即可,如果满足了条件,那么用户这一天的数据就是满足我们的需求的,也就是说这个用户是满足我们的需求的。
with tmp as(-- 每个人每天打卡的次数selectunion_id,to_date(ds,'yyyymmdd') as dt,count(1) as cntfromods_la_daily_record_diwhere-- 驱动表的时间限制ds>='${begin_bizdate}' and ds<= '${end_bizdate}'group byunion_id, ds
)
selectt1.union_id
from (-- 满足条件的(用户-天)selectt1.union_id,t1.dt,sum(t2.cnt) as `打卡次数`,count(1) as `打卡天数`from tmp as t1inner join tmp as t2on t1.union_id=t2.union_idand DATEDIFF(t2.dt,t1.dt)>=0 and DATEDIFF(t2.dt,t1.dt)<=6group byt1.union_id,t1.dthaving-- 次数限制sum(t2.cnt)>=8-- 天数限制and count(1)>=4
)
group by-- 对用户去重t1.union_id
;
这里有一个问题需要注意一下,那就是我们满足条件sum(b.cnt)>=8 and count(1)>=4
的是用户某一天的数据,也就是说我们的维度是union_id - 天
,所以我们需要对这个数据按照用户为度进行去重。
扩展基于自然周的的滚动时间窗口计算
我们这里思考一个问题,那就是我们知道很多时候我们的计算其实是围绕着自然周的,虽然我们上面的计算不是自然周,那假设我们如果要求我们的计算是自然周呢,那这个时候我们应该怎么计算呢?
其实我们数仓里有一种很表叫做时间维表,我们利用时间维表可以很方便的计算时间相关的东西,如果你没有的话建议去网上找一份,或者自己生成一份,因为使用起来很方便。
因为这个表的字段很多,这里我们截取了一部分放到这里了,下面我们看一下怎么使用时间维表进行计算。
selectt1.union_id,t2.time_weeknum,count(1) as `打卡天数`,sum(t1.cnt) as `打卡次数`
from(selectunion_id,to_date(ds,'yyyymmdd') as dt,count(1) as cntfromods_la_daily_record_diwhere-- 驱动表的时间限制ds>='${begin_bizdate}' and ds<= '${end_bizdate}'group byunion_id, ds
) as t1
left join dim_date_time as t2
on t1.ds = t2.time_date
group byt1.union_id,-- 周的标识t2.time_weeknum
having-- 时间分布在4天以上count(1)>=4-- 打卡次数在8次以上and sum(t1.cnt)>=8
;
这里我们就基于每个自然周算出了满足条件的人,当然我们还是要针对用户去重
总结
我们看到自关联其实可以达到滑动的效果,当然不仅仅体现在时间上,就像窗口除了时间窗口还是有基于个数的窗口,我们要在遇到类似问题的时候就可以选择这样的解决方案。时间维表很重要,可以简化我们的计算,如果没有的话,需要创建一个。
Hive实现时间滑动窗口计算相关推荐
- StructedStreaming-基于事件时间的窗口计算
时间分类 事件时间:事件产生的时间 摄入时间:事件到达流系统的时间 处理时间:事件被流系统处理的时间 注:在实际开发中一般都要基于事件时间进行窗口计算,因为事件时间更能代表事件的本质. 例如:2021 ...
- DataScience:数据处理技术之针对时间序列数据衍变—构造时间滑动窗口数据的简介、代码实现、案例应用之详细攻略
DataScience:数据处理技术之针对时间序列数据衍变-构造时间滑动窗口数据的简介.代码实现.案例应用之详细攻略 目录 时间滑动窗口数据的简介
- 一种基于时间滑动窗口的黑产团伙挖掘算法
今天的博客主要参考了2014年facebook在会议SIGSAC上发表的paper<Uncovering Large Groups of Active Malicious Accounts in ...
- 【Python】利用滑动窗口计算全基因组每个窗口上CNV的拷贝数和Vst
目录 Vst介绍 计算每个窗口的绝对拷贝数 1.文件准备 2.编写脚本 计算每个窗口的Vst Vst介绍 Vst是通过计算拷贝数的方差来衡量不同群体之间CNV的分化的一个指标,类似于Fst的概念,可以 ...
- Flink 中的时间和窗口
时间和窗口 一.时间语义 1. Flink 中的时间语义 1.1 处理时间(Processing Time) 1.2 事件时间(Event Time) 1.3 两种时间语义的对比 二.水位线(Wate ...
- 第三课 大数据技术之Fink1.13的实战学习-时间和窗口
第三课 大数据技术之Fink1.13的实战学习-时间和窗口 文章目录 第三课 大数据技术之Fink1.13的实战学习-时间和窗口 第一节 时间定义 1.1 Flink中的时间语义 1.2 两种时间语义 ...
- 大厂常见笔试题 滑动窗口内数的和
大厂常见笔试题,我以为出一个很难的题,结果出了一个基础题, 给你一个大小为n的整型数组和一个大小为k的滑动窗口,将滑动窗口从头移到尾,输出从开始到结束每一个时刻滑动窗口内的数的和. 样例 对于数组 [ ...
- 滑动窗口与双指针的区别
双指针 计算过程仅与两端点相关的称为双指针. 不固定大小. 双指针是解决问题的一种方法. 双指针可以同向移动可以双向移动. 同向移动的双指针和滑动窗口没有任何联系 滑动窗口 计算过程与两端点表示的区间 ...
- 数仓工具—Hive实战之滑动/滚动时间窗口计算(19)
时间滑动计算 今天遇到一个需求大致是这样的,我们有一个业务涉及到用户打卡,用户可以一天多次打卡,我们希望计算出7天内打卡8次以上,且打卡时间分布在4天以上的时间,当然这只是个例子,我们具体解释一下这个 ...
最新文章
- 虚拟服务器的运行原理,虚拟机复制的工作原理
- 大型Web前端架构设计:面向抽象编程入门
- Linux与云计算——第二阶段 第五章:存储Storage服务器架设—分布式存储Ceph
- 解决安卓中单个dex方法数超过65535的方法
- Android 新闻客户端
- Tour West Australia by Motorcycle
- 如何在繁忙的工作中锻炼身体?
- 大数据数据库(HBase)
- python源码中的pass
- plc原理及应用_【工控资料】西门子、三菱、欧姆龙PLC电气设计与编程自学宝典(双色版)...
- 每日新闻丨阿里巴巴香港IPO指引价每股176港元左右;全球超级计算机500强榜单出炉...
- 2021超级热门引流红包裂变微信分享朋友圈广告游戏源码
- 人工智能和自动化之间,主要有区别吗?
- 加入AI考拉大家庭,是一种怎样的体验?--来自考拉码农的心声
- Mac 上怎么双开微信
- python 股票交易接口 github_GitHub - xiongyixiaoyang/vnpy: 基于python的开源量化交易平台开发框架...
- 卡尔曼滤波 - 状态空间模型中的状态方程
- android:completionthreshold=1,android:completionThreshold=1是哪个组件的属性( )
- 粪菌移植构建人源化菌群小鼠的分析探讨
- 中琅条码标签打印软件中打印设置中的相关问题
热门文章
- 【整理】Matlab常用函数
- 苹果手机fiddler代理后无法联网的问题
- ios设备使用socks代理_iOS使用socks5代理服务器
- 动态规划8FatMouse's Speed
- 面试指南(三):想跳槽,这些问题你会了吗?
- 2021年昆明师专附中高考成绩查询,云南省昆明市云南师范大学附属中学2020-2021学年高三高考适应性月考卷(一)语文试题...
- 网卡工作模式(混杂模式)
- 用JS写右下角烦人的弹窗小广告
- SLC MLC TLC QLC擦写次数
- 2022-2028全球核反应堆安全壳市场现状及未来发展趋势