0

我有一个AggregateFunction ,它计算WindowedStream中一系列事件的平均值。
这里需要注意的是,需要对可能乱序(或根本不乱序)到达的事件对计算平均值。

换句话说,我需要在计算之前对数据进行排序,因为顺序很重要。

我可以使用getResult API 来做到这一点,但是在窗口中的每个事件上都会调用这个函数,这在性能方面没有意义。我也可以用flink-cep做到这一点,但出于同样的原因我想避免它。

理想情况下,我只想在窗口关闭时计算最后的平均值(我可以对数据进行一次排序)。

是否有某种处理程序?我发现最接近的东西是triggers,但没有关闭窗口的方法。

谢谢

编辑:
我最终使用带有增量聚合的 ProcessWindowFunction

ProcessWindowFunction 可以与 ReduceFunction、AggregateFunction 或 FoldFunction 组合,以在元素到达窗口时递增地聚合元素。当窗口关闭时,将向 ProcessWindowFunction 提供聚合结果。这允许它在访问 ProcessWindowFunction 的附加窗口元信息的同时增量计算窗口。

4

1 回答 1

1

您可以使用没有增量聚合的ProcessWindowFunction而不是 AggregateFunction。这个函数会在窗口被触发时被调用,并且会被传递一个包含窗口内容的 Iterable 和一个可以用来发出结果的 Collector。

当 ProcessWindowFunction 被调用时,您可以对内容进行排序,并产生您想要的任何输出。

于 2019-02-05T21:53:19.933 回答