当前位置: 首页 > 知识库问答 >
问题:

Flink:仅在会话窗口结束时计算

郑晨
2023-03-14

我有一个聚合函数,它计算WindowedStream中一系列事件的平均值。
这里的警告是,平均值需要在可能无序(或根本没有)到达的事件对上计算。

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

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

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

这有什么处理程序吗?我找到的最接近的东西是触发器,但是没有关闭窗口的方法

谢谢

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

ProcessWindowFunction可以与RedueFunction、Aggregate Function或FoldFunction相结合,以便在元素到达窗口时逐步聚合元素。当窗口关闭时,ProcessWindowFunction将提供聚合结果。这允许它增量计算窗口,同时可以访问ProcessWindowFunction的附加窗口元信息。

共有1个答案

荆城
2023-03-14

您可以使用ProcessWindowFunction而不是AggregateFunction,而无需增量聚合。触发窗口时将调用此函数,并将传递一个包含窗口内容的Iterable和一个可用于发出结果的收集器。

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

 类似资料:
  • 我已经能够创建一个“会话开始信号”流,如本答案所述。 是否可以在每次窗口聚合结束时创建一个“会话结束信号”流?

  • 我有一个由两个字段“键控”的记录流,然后分配一个间隔为30秒的会话窗口。我使用附加在记录上的“时间戳”作为事件时间。我正在使用“Assign AscendingTimeStamps”水印。 以下面的记录为例。该流由(用户,place)键控。 Record1:user1,place1,timestamp t1 Record2:user2,place1,timestamp在t1之后30秒 桶1 Rec

  • 我有两个流,希望将第二个流连接到窗口内的第一个流,因为我需要对与会话相关的两个流的连接进行一些计算(流的连接控制会话)。 实际上,当从留档读取时,(会话)窗口只允许在单个流上进行计算,而不允许在连接中进行计算。 我曾尝试使用会话窗口和协处理器函数的组合,但结果并不完全符合我的预期。 有没有办法合并Flink中与会话窗口相关的两个流?

  • 我想知道是否可以创建类似于以下内容的WindowAssigner: 但我不希望窗口在每个元素的事件时间中保持增长。我希望在接收到的第一个元素(对于该键)处定义窗口的开头,并在1秒后精确结束,无论有多少元素到达该秒。 所以它可能看起来像这样的假设: 谢谢

  • Flink中的会话窗口在prod env上没有按预期工作(相同的逻辑在本地env上工作)。这个想法是为特定的用户ID发出“sample_event_two”的计数 尽管集合中存在sample_event_one(通过验证日志消息“已接收sample_event_one”是否存在来确认)并且计数计算正确,但我没有看到任何输出事件被创建。我看到日志消息“未找到 sampleOneEvent 事件,而不

  • 在Apache Flink中使用滑动时间窗口时,当窗口滑动时会重新计算窗口中的许多元组/元素。例如,假设一个窗口大小为5秒,滑动时间为1秒,则窗口内容的80%与上一个窗口的内容相同。 考虑一个数据流S,其元组由时间戳和整数值组成: , , , , , , ,... 假设t1、t2、t3、...表示连续时间戳,其中t2-t1=1秒。给定S,窗口大小为5秒、滑动1秒的Flink窗口化ProcessWi