流处理系统 第四章 高级窗口
本章主要是讲解一些窗口函数相关的高级话题。首先会讲一下基于处理时间的窗口函数(processing-time windowing)的两种实现,对比加深理解基于事件时间(event-time windowing)的窗口函数,并且了解什么时候该用处理时间窗口函数,什么时候该用事件时间的窗口函数。接着讲解会话窗口(session windows), 最后会介绍一下自定义窗口函数(custom windowing)的重要性。
处理时间窗口
处理时间窗口函数的重要性体现在两个方面
(1)在特定场景下,例如使用情况监控,人们只对事件的观察时间比较关心,这时候用处理时间窗口函数比较方便
(2)某些情况下,事件发生的事件非常重要,比如用户行为分析,收费记账等,这个时候处理时间窗口函数就是错误的,谨记分辨这种情况
处理时间窗口函数的实现方式有两种:
(1)利用触发器。让触发器基于处理时间,忽略掉事件时间
(2)将处理时间赋值给事件时间,这时事件时间相关的窗口函数便是处理时间窗口函数
例子:
两种输入:灰色代表一组输入数据,粉色代表另一组数据

基于事件时间窗口函数计算后的结果

第一种方法实现的处理时间窗口计算后的结果

第二种方法实现的处理时间窗口函数结果

对比可以发现,事件时间窗口函数的计算结果对输入数据的处理时间不敏感,而处理时间窗口函数反之。另外第二种处理时间窗口函数的实现又时间平移的效果。
会话窗口
会话窗口的两个特点:
(1)数据驱动。窗口的位置、大小是与数据自身相关的,而不是预先定义好的
(2)非对齐。窗口不是均匀的。

会话窗口的定义非常简单,我们只需要定义时间间隔,如果两个事件间隔小于定义好的间隔,就可以将两个对应的窗口合并,形成一个新的会话窗口。上图就是一个简单的例子,原本五个会话窗口合并形成了最后的两个窗口
下边是一个复杂一点的例子,更好的阐释合并的过程

自定义窗口
前边章节提到过固定长度窗口,滑动窗口和会话窗口,这些窗口函数组合可以实现非常复杂的数据处理任务,而Beam除此之外还提供了自定义窗口功能
自定义窗口需要实现两个基本函数:
(1)窗口分配
(2)窗口合并
自定义实现固定窗口:
非对齐的固定窗口:
按照元素对齐的固定窗口:
自定义会话窗口:
自定义带长度限制的会话窗口:

对比之前的会话窗口合并动态图,不难发现由于会话长度的限制,后边一些会话窗口并没有合并
可见自定义窗口是一个非常强大的工具,现在大部分流处理系统没有提供自定义窗口的功能。