我有一个aggregatefunction,它计算windowedstream中一系列事件的平均值。
这里需要注意的是,平均值需要对可能无序(或者根本没有)到达的事件对进行计算。
换句话说,我需要在计算之前对数据进行排序,因为序列很重要。
我可以用getresult api来实现这一点,但是这个函数在窗口中的每个事件上都被调用,这在性能方面没有意义。我也可以用flink cep来做这件事,但出于同样的原因我想避免。
理想情况下,当窗口关闭时,我只希望在最后计算平均值(在这里我可以对数据进行一次排序)。
有什么处理方法吗?我找到的最接近的东西是触发器,但是没有关闭窗口的方法。
谢谢
编辑:
我最终使用了带有增量聚合的processwindowfunction
processwindowfunction可以与reducefunction、aggregatefunction或foldfunction组合,以在元素到达窗口时增量聚合元素。当窗口关闭时,processwindowfunction将提供聚合结果。这允许它在访问processwindowfunction的其他窗口元信息的同时增量计算窗口。
1条答案
按热度按时间whitzsjs1#
您可以使用processwindowfunction而不是aggregatefunction,而无需增量聚合。触发窗口时将调用此函数,并将传递一个包含窗口内容的iterable和一个可用于发出结果的收集器。
调用processwindowfunction时,可以对内容进行排序,并生成所需的任何输出。