TUMBLE滚动窗口发生的一件趣事

记录一下比较有意思的一件事

问题描述

1
2
3
4
5
6
7
8
9
10
11
12
13
朋友在入职新公司之后翻看任务SQL时,问了一个关于TUMBLE的使用问题
SQL中的语法为TUMBLE(time,1 DAY,30 MIN)
产生的结果为每30分钟产生当天的全量数据统计

emm,第一反应,明明是个滚动窗口,怎么还有个步长

自身翻阅了下文档,按理这里的30MIN应该代表的是窗口开始的偏移量
比如不使用30MIN,窗口为[2021-11-17 00:00:00,2021-11-18 00:00:00)
使用之后是[2021-11-17 00:30:00,2021-11-18 00:30:00)
一般是用来做时区一致性的

不卖关子,其实是他们平台部门做了二次开发,将后面的30MIN这个参数定义为trigger周期
传送门(https://www.jianshu.com/p/3ecdfd470793)

深入了解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
带着问题去看源码
1.窗口的原有触发定义是什么样的?
2.怎么去自定义一个触发器?

针对问题1涉及的类,这里只看EventTime
StreamExecGroupWindowAggregate.createWindowOperator
根据不同窗口类型,构建WindowOperator
WindowOperatorBuilder.withEventTime
分配(assigner)窗口大小,并指定触发规则(trigger)
EventTimeTriggers.afterEndOfWindow
在窗口结束时间触发窗口计算
这里可以补充下Tumble窗口的窗口边界计算逻辑
start = timestamp - (timestamp - offset + size) % size
end = start + size
timestamp 时间字段的值
offset 定义的偏移量
size 窗口定义大小
这是没有任何配置的情况下,如果有配置,可以查看下WindowEmitStrategy.getTrigger
里面详细的定义了不同的表参数下,定义的触发器策略
延迟触发,提前触发等

针对问题2,其实看到这里,基本上也会有一个模糊的思路
将原有的触发策略,根据窗口传参的个数,做一个switch
指定不同触发策略
具体的实现后面有时间可以尝试实现一下