Flink实战 - 周窗口-week window实现

本文详细介绍了如何在Flink中使用TumblingEventTimeWindows实现周级别的滚动窗口,通过设置时间偏移量避免自定义窗口分配器。通过分析源码,得出使用Time.days(7)和Time.hours(-80)或者Time.days(7)和Time.hours(-104)可以实现从周一或周日开始的周窗口。内容包括需求分析、问题探讨、解决方案以及源码解析。
摘要由CSDN通过智能技术生成

原文链接:https://blog.csdn.net/m0_49826240/article/details/117296559

结论:

先说结论吧:

Flink 使用 timeWindow,如何使用周级别的滚动窗口

不需要自定义窗口分配器!不需要自定义窗口分配器!

第一种:开始时间为周一 00:00:00,结束时间为 周日 23:59:59

.window(TumblingEventTimeWindows.of(Time.days(7), Time.hours(-80)));

第二种:开始时间为周天 00:00:00,结束时间为 周六 23:59:59

.window(TumblingEventTimeWindows.of(Time.days(7), Time.hours(-104)));

至于为什么,往下看。阅读源码来解释

 

数据需求

接到一个实时数据的需求,大致的内容就是实时统计每个店铺的一周GMV。

分析这个需求,明确的点:

       1.周期长度为1周,也就是7天,7 x 24 个小时。

       2.每个周期的开始时间:周一 00:00:00,结束时间:周日 00:00:00

按照日历中的划分,每周的开始是周日,结束是周六。这个我们不需要纠结这么多。

遇到的问题

这个需要可以用两种方式来做

1.使用 keyby-process,对商家ID做key by,然后在process中做每周的GMV统计即可。

2.使用 timeWindow,使用支付时间开窗,累计一周的时间。

此处我们主要探讨第二种方案。

本文提及的这个需求,更实用使用滚动窗口计算,下面这行代码就是平时实时的写法。

.window(TumblingEventTimeWindows.of(Time.days(7), Time.hours(-8)));

此时可以发现,Time.day() 已经是提供的最大时间单位了,并没有想要使用 Time.week()。那么使用 Time.day(7)呢?

行不行,试一下就知道了,做个小实验,读取端口 9910 数据,使用  TumblingEventTimeWindows.of(Time.days(7), Time.hours(-8))

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(T
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值