处理一些我想每15秒对其进行一次折叠的数据。从"外部"看,窗口似乎保存了持续时间内的所有数据,然后一次将其提交给折叠函数。
真相?
如果是这样的话,是否有一种方法可以在每次提交新数据时调用fold函数,然后在窗口结束时只返回结果?
是否有其他转换组合可以实现这种效果?
您的观察是正确的。原因是当前窗口运算符的实现有些有限。从概念上讲,窗口运算符中有两个元素:窗口缓冲区和窗函数。假设窗口运算符的输入类型为IN
,输出类型为OUT
。现在,窗口缓冲区存储类型为IN
的元素,当需要发射元素时,它会发射类型为IN
的元素。窗口函数获得元素IN
的集合作为输入,并发射类型为OUT
(Collection[IN] -> OUT
)的元素。
如果窗口函数是reduce函数,我们可以在窗口缓冲区内预聚合,因为它的签名是(IN, IN) -> IN
。窗口函数基本上只从窗口缓冲区中获取一个可以发出的元素。
如果我们想要一个有效的折叠,事情会变得稍微复杂一些,因为我们需要窗口缓冲区来获取类型为IN
但发出类型为OUT
的元素,并且窗口函数看起来像这样:OUT -> OUT
。
这是可能的,但现在还没有实现。(顺便说一句,我为此开了一期Jira:https://issues.apache.org/jira/browse/FLINK-2991)