我想每隔15秒处理一次折叠数据。从“外部”看来,窗口似乎在保留该持续时间内的所有数据,然后立即将其全部提交给fold函数。

真相?

如果是这样,是否有一种方法可以在每次提交新数据时都调用fold函数,然后仅在窗口末尾返回结果?

是否可以将其他转换组合在一起以实现此效果?

最佳答案

您的观察是正确的,是的。原因是窗口运算符的当前实现受到一定限制。从概念上讲,窗口运算符中有两个元素:窗口缓冲区和窗口函数。假设窗口运算符的输入类型为IN,输出类型为OUT。现在,窗口缓冲区存储类型为IN的元素,并且当需要发射元素时,它将发射类型为IN的元素。窗口函数将输入元素IN的集合作为输入,并发出类型为OUTCollection[IN] -> OUT)的元素。

如果window函数是reduce函数,我们可以在窗口缓冲区内进行预聚合,因为该窗口的签名为(IN, IN) -> IN。窗口函数基本上只从它可以发出的窗口缓冲区中获取一个元素。

如果我们想要有效的折叠,事情会变得稍微复杂一些,因为我们需要窗口缓冲区接收IN类型的元素,但是发出OUT类型,并且window函数看起来像这样:OUT -> OUT

可以做到,但是现在还没有实现。 (顺便说一句,我为此打开了一个《 Jira问题》:https://issues.apache.org/jira/browse/FLINK-2991

07-24 09:49
查看更多