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