结论:窗口的开始时间,并不一定是最早的记录时间,而是一个计算出来的时间

Flink的窗口函数起始时间计算公式:

timestamp - (timestamp - offset + windowSize) % windowSize
# timestamp为最早时间的记录时间戳
# offset 为参数偏移时间
# windowSize为窗口大小
# 以上计算单位全部统一到毫秒再进行计算

业务代码: .window(TumblingEventTimeWindows.of(Time.seconds(3L)))

其中滚动窗口api:TumblingEventTimeWindows of(Time size, Time offset)

源码:

类:org.apache.flink.streaming.api.windowing.windows.TimeWindow
public static long getWindowStartWithOffset(long timestamp, long offset, long windowSize) {return timestamp - (timestamp - offset + windowSize) % windowSize;
}

如果offset不输入,默认为0,那么起始时间就是timestamp - timestamp+windowsize和windowsize的取模,假定以秒为小单位。

输入时间是个偶数秒T,windowsize长度为2s,offset为0的情况下,那么经过取模部分值为0,起始时间就是T。

写个小程序计算下启动时间:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;public class WindowStartTimeCalculate {public static void main(String[] args) throws Exception {String[] ss = {"2020-04-20 10:12:44", "2020-04-20 8:50:44", "2020-04-20 14:12:44", "2020-04-20 18:12:44", "2020-04-20 20:12:44"};for (String date : ss) {cac(Time.days(1L), date, Time.hours(16L));}}/*** @param w 窗口大小* @param d 事件时间* @param o 偏移时间* @throws Exception*/public static void cac(Time w, String d, Time o) throws Exception {LocalDateTime parse = LocalDateTime.parse(d, DateTimeFormatter.ofPattern("yyyy-MM-dd H:mm:ss"));long timestamp = parse.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();long offset = o.toMilliseconds();long windowSize = w.toMilliseconds();long startTime = timestamp - (timestamp - offset + windowSize) % windowSize;System.out.println("offset:" + offset + ", windowSize: " + windowSize + ", " + startTime + "--" + LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault()));}
}

窗口1天:

偏移时间不填写,那么起始时间是:2020-04-20T08:00

偏移时间1小时Time.hours(1L),那么起始时间是:2020-04-20T09:00

依次类推...

偏移时间16小时,则起始时间为:2020-04-20T00:00

偏移时间23小时,则起始时间为:2020-04-20T07:00

窗口3s,规律不明显,大部分都是-1s:

offset:0, windowSize: 3000, record:2020-04-20 10:12:01 ,startTime:2020-04-20T10:12:00
offset:0, windowSize: 3000, record:2020-04-20 08:50:14 ,startTime:2020-04-20T08:50:12
offset:0, windowSize: 3000, record:2020-04-20 14:12:37 ,startTime:2020-04-20T14:12:36
offset:0, windowSize: 3000, record:2020-04-20 18:12:49 ,startTime:2020-04-20T18:12:48
offset:0, windowSize: 3000, record:2020-04-20 20:12:50 ,startTime:2020-04-20T20:12:48

窗口10s,则起始时间以事件时间个位数为0的时间开始:

offset:0, windowSize: 10000, record:2020-04-20 10:12:01 ,startTime:2020-04-20T10:12:00
offset:0, windowSize: 10000, record:2020-04-20 8:50:14 ,startTime:2020-04-20T08:50:10
offset:0, windowSize: 10000, record:2020-04-20 14:12:37 ,startTime:2020-04-20T14:12:30
offset:0, windowSize: 10000, record:2020-04-20 18:12:49 ,startTime:2020-04-20T18:12:40
offset:0, windowSize: 10000, record:2020-04-20 20:12:50 ,startTime:2020-04-20T20:12:50

窗口5秒:

offset:0, windowSize: 5000, record:2020-04-20 10:12:01 ,startTime:2020-04-20T10:12:00
offset:0, windowSize: 5000, record:2020-04-20 8:50:14 ,startTime:2020-04-20T08:50:10
offset:0, windowSize: 5000, record:2020-04-20 14:12:37 ,startTime:2020-04-20T14:12:35
offset:0, windowSize: 5000, record:2020-04-20 18:12:49 ,startTime:2020-04-20T18:12:45
offset:0, windowSize: 5000, record:2020-04-20 20:12:50 ,startTime:2020-04-20T20:12:50

窗口为500毫秒,偏移为空值,则起始时间就是最早记录:

offset:0, windowSize: 500, record:2020-04-20 10:12:01 ,startTime:2020-04-20T10:12:01
offset:0, windowSize: 500, record:2020-04-20 8:50:14 ,startTime:2020-04-20T08:50:14
offset:0, windowSize: 500, record:2020-04-20 14:12:37 ,startTime:2020-04-20T14:12:37
offset:0, windowSize: 500, record:2020-04-20 18:12:49 ,startTime:2020-04-20T18:12:49
offset:0, windowSize: 500, record:2020-04-20 20:12:50 ,startTime:2020-04-20T20:12:50

Flink滚动窗口函数的开窗起始时间计算规则相关推荐

  1. Flink窗口起始时间计算

    Flink中窗口的时间不是根据进入窗口的第一个元素计为窗口的开始时间和加Size计窗口结束时间,而是根据Flink内置计算公式timestamp - (timestamp - offset + win ...

  2. JS 获取合同的起始时间与终止时间------日期增加自然月,年。

    需求: 在线签订电子合同: 获取合同的起始时间与终止时间,以用户点击签约为起始时间,计算用户在页面中选择的合约生效时长(可选6个月.1年等等)并推算出终止时间: 实现难点: 可能存在大月小月以及平年闰 ...

  3. 【随记】Flink 时间窗口的起始时间

    话不多说,直接上手今天的主题,探索一个容易让人忽略和困惑的问题:Flink 时间窗口的起始时间 就以最简单的demo为例: timeWindow(Time.seconds(5)) 上述定义一个步长为5 ...

  4. 自定义起始时间的时间戳计算(个人代码记录)

    个人代码记录,这个时间戳计算,由于项目数据特殊需求,自己设置的时间戳起始时间为2019年1月1日开始, 然后根据时间戳数据计算出现在时间,具体使用如下,这里setFullYear的月份是0到11,所以 ...

  5. 计算起始时间与结束时间之间有哪些月份和周数

    estLabourMonth() {const months = []const monthCol = []const start = new Date(this.form.project_start ...

  6. 有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。 读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字

    有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分.现在,你的程序要根据起始时间和流逝的时间计算出终止时间. 读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表 ...

  7. JS计算请假时间(起始时间与终止时间)

    正常上班时间为周一至周五 9:00 -12:00,13:00-18:00,实现了选择了请假起始时间与终止时间后,算出请假的总小时数,此总小时数扣除了非上班时间(周末,还有一天中的非上班时间:如午休的那 ...

  8. Java 某个起始时间,固定的累加天数,计算周期

    Java 某个起始时间,固定的一个天数相加,计算周期每次加过后的周期 前言 项目中有这么一个业务场景,数据库中某张表有个起始时间,和一个累加时间,比如2020-01-07,往后每次加3天为一个周期,到 ...

  9. 然后是几点:根据起始时间和流逝的时间计算出终止时间(起始时间和终止时间不一定在同一天内)

    今日PTA题目: 有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分.现在,你的程序要根据起始时间和流逝的时间计算出终止时间. 读入两个数字,第一个数字以这样的四位数字表示当前 ...

最新文章

  1. 循环求100内质数 php_C8循环
  2. openresty require报错
  3. Failed to install DroidIPCam.apk on device 'emulator-5554': timeout
  4. python opencv 录制视频_OpenCV Python 录制视频
  5. oracle sql 分页
  6. python字符串大全_Python 字符串操作方法大全
  7. git add remote_Git常用命令
  8. [Angularjs] 第一步开始一个项目
  9. java调python代码_java调用python代码
  10. TensorFlow2.0学习使用笔记
  11. pdfjs 字体新增_JSPDF支持中文(思源黑体)采坑之旅,JSPDF中文字体乱码解决方案...
  12. SAP: Query创建教程
  13. ug如何复制面_了解了一下内容,让你UG快速入门
  14. 平面设计配色方案有哪些
  15. SAP MM之移动类型(Movement type-MVT)_小七_新浪博客
  16. iOS 10 新特性
  17. UG NX二次开发(C#)-装配-删除阵列矩阵
  18. 正则匹配所有的a标签
  19. 简单了解一下LCD屏工作原理
  20. 存储芯片引脚和时序:SRAM(HY6264A系列)

热门文章

  1. matlab有限元法求解转子固有频率,多支承转子系统辛空间传递矩阵法及应用
  2. [程序员学英语]26个英文字母
  3. 这是什么在线客服系统?
  4. Java音乐播放器设计
  5. 观察者模式(C语言实现)
  6. Python爬虫必备知识点--整理核心基础
  7. element audio 标签 不显示_不闪屏,HDR,带鱼屏全都有,LG 29WK600宽屏显示器测评...
  8. syntax error: unexpected :=解决方案
  9. gvim 换行符替换
  10. 想要定制个性化语音?来试试这几个配音软件