Hive实现时间滑动窗口计算

  • 时间滑动计算
  • 外部调用实现时间循环
  • 自关联实现滑动时间窗口
  • 扩展基于自然周的的滚动时间窗口计算
  • 总结

时间滑动计算

需求大致是这样的,我们有一个业务涉及到用户打卡,用户可以一天多次打卡,我们希望计算出7天内打卡8次以上,且打卡时间分布在4天以上的时间

具体解释一下这个需求

  1. 用户一天可以打卡多次,所以要求打卡必须分布在4天以上;

  2. 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实现时间滑动窗口计算相关推荐

  1. StructedStreaming-基于事件时间的窗口计算

    时间分类 事件时间:事件产生的时间 摄入时间:事件到达流系统的时间 处理时间:事件被流系统处理的时间 注:在实际开发中一般都要基于事件时间进行窗口计算,因为事件时间更能代表事件的本质. 例如:2021 ...

  2. DataScience:数据处理技术之针对时间序列数据衍变—构造时间滑动窗口数据的简介、代码实现、案例应用之详细攻略

    DataScience:数据处理技术之针对时间序列数据衍变-构造时间滑动窗口数据的简介.代码实现.案例应用之详细攻略 目录 时间滑动窗口数据的简介

  3. 一种基于时间滑动窗口的黑产团伙挖掘算法

    今天的博客主要参考了2014年facebook在会议SIGSAC上发表的paper<Uncovering Large Groups of Active Malicious Accounts in ...

  4. 【Python】利用滑动窗口计算全基因组每个窗口上CNV的拷贝数和Vst

    目录 Vst介绍 计算每个窗口的绝对拷贝数 1.文件准备 2.编写脚本 计算每个窗口的Vst Vst介绍 Vst是通过计算拷贝数的方差来衡量不同群体之间CNV的分化的一个指标,类似于Fst的概念,可以 ...

  5. Flink 中的时间和窗口

    时间和窗口 一.时间语义 1. Flink 中的时间语义 1.1 处理时间(Processing Time) 1.2 事件时间(Event Time) 1.3 两种时间语义的对比 二.水位线(Wate ...

  6. 第三课 大数据技术之Fink1.13的实战学习-时间和窗口

    第三课 大数据技术之Fink1.13的实战学习-时间和窗口 文章目录 第三课 大数据技术之Fink1.13的实战学习-时间和窗口 第一节 时间定义 1.1 Flink中的时间语义 1.2 两种时间语义 ...

  7. 大厂常见笔试题 滑动窗口内数的和

    大厂常见笔试题,我以为出一个很难的题,结果出了一个基础题, 给你一个大小为n的整型数组和一个大小为k的滑动窗口,将滑动窗口从头移到尾,输出从开始到结束每一个时刻滑动窗口内的数的和. 样例 对于数组 [ ...

  8. 滑动窗口与双指针的区别

    双指针 计算过程仅与两端点相关的称为双指针. 不固定大小. 双指针是解决问题的一种方法. 双指针可以同向移动可以双向移动. 同向移动的双指针和滑动窗口没有任何联系 滑动窗口 计算过程与两端点表示的区间 ...

  9. 数仓工具—Hive实战之滑动/滚动时间窗口计算(19)

    时间滑动计算 今天遇到一个需求大致是这样的,我们有一个业务涉及到用户打卡,用户可以一天多次打卡,我们希望计算出7天内打卡8次以上,且打卡时间分布在4天以上的时间,当然这只是个例子,我们具体解释一下这个 ...

最新文章

  1. 虚拟服务器的运行原理,虚拟机复制的工作原理
  2. 大型Web前端架构设计:面向抽象编程入门
  3. Linux与云计算——第二阶段 第五章:存储Storage服务器架设—分布式存储Ceph
  4. 解决安卓中单个dex方法数超过65535的方法
  5. Android 新闻客户端
  6. Tour West Australia by Motorcycle
  7. 如何在繁忙的工作中锻炼身体?
  8. 大数据数据库(HBase)
  9. python源码中的pass
  10. plc原理及应用_【工控资料】西门子、三菱、欧姆龙PLC电气设计与编程自学宝典(双色版)...
  11. 每日新闻丨阿里巴巴香港IPO指引价每股176港元左右;全球超级计算机500强榜单出炉...
  12. 2021超级热门引流红包裂变微信分享朋友圈广告游戏源码
  13. 人工智能和自动化之间,主要有区别吗?
  14. 加入AI考拉大家庭,是一种怎样的体验?--来自考拉码农的心声
  15. Mac 上怎么双开微信
  16. python 股票交易接口 github_GitHub - xiongyixiaoyang/vnpy: 基于python的开源量化交易平台开发框架...
  17. 卡尔曼滤波 - 状态空间模型中的状态方程
  18. android:completionthreshold=1,android:completionThreshold=1是哪个组件的属性( )
  19. 粪菌移植构建人源化菌群小鼠的分析探讨
  20. 中琅条码标签打印软件中打印设置中的相关问题

热门文章

  1. 【整理】Matlab常用函数
  2. 苹果手机fiddler代理后无法联网的问题
  3. ios设备使用socks代理_iOS使用socks5代理服务器
  4. 动态规划8FatMouse's Speed
  5. 面试指南(三):想跳槽,这些问题你会了吗?
  6. 2021年昆明师专附中高考成绩查询,云南省昆明市云南师范大学附属中学2020-2021学年高三高考适应性月考卷(一)语文试题...
  7. 网卡工作模式(混杂模式)
  8. 用JS写右下角烦人的弹窗小广告
  9. SLC MLC TLC QLC擦写次数
  10. 2022-2028全球核反应堆安全壳市场现状及未来发展趋势