原文链接: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