使用我想要每15秒执行折叠的一些数据。来自'外面'它看起来好像窗口持有持续时间内的所有数据,然后一次性将其提交给fold函数。
的真实?
如果是这样,有没有办法在每次提交新数据时都调用fold函数,然后只是结果在窗口结束时返回?
是否有其他一些转换组合可以组合起来实现这种效果?
答案 0 :(得分:2)
你的观察是正确的,是的。原因是窗口操作符的当前实现有些限制。从概念上讲,窗口运算符中有两个元素:窗口缓冲区和窗口函数。假设窗口运算符的输入类型为IN
,输出类型为OUT
。现在,窗口缓冲区存储了IN
类型的元素,当需要发出元素时,它会发出类型为IN
的元素。 window函数将元素IN
的集合作为输入,并发出OUT
(Collection[IN] -> OUT
)类型的元素。
如果window函数是reduce函数,我们可以在窗口缓冲区内预先聚合,因为它的签名是(IN, IN) -> IN
。窗口函数基本上只从它可以发出的窗口缓冲区中获取一个元素。
如果我们想要一个有效的折叠,事情会变得稍微复杂一些,因为我们需要窗口缓冲区来获取IN
类型的元素但是发出类型OUT
并且窗口函数看起来像这样:{{1 }}
可以这样做,但它现在没有以这种方式实现。 (顺便说一句,我为此开了一个Jira问题:https://issues.apache.org/jira/browse/FLINK-2991)