如何拥有一个忽略最近事件的真实滑动窗口?

时间:2018-06-13 17:00:31

标签: apache-flink flink-streaming

我正在尝试构建类似于滑动窗口的窗口,并且:

  • 计算事件,忽略从窗口结束到某个“延迟”的那些事件
  • 每次触发一次且仅触发一次
  • [事件TS - 延迟 - 持续时间,事件TS - 延迟]中的事件输出计数
  • 使用预聚合来避免保存所有事件。

窗口的参数为:

  • 持续时间:窗口的持续时间
  • 输出:要触发的事件的偏移量,从窗口结束开始计算。类似于“幻灯片”。
  • 延迟:要忽略的事件的偏移量,从窗口末尾开始计算。基本上忽略事件,例如时间戳< =窗口结束 - 幻灯片 - 延迟。

我尝试的想法涉及一个滑动窗口:

  • 持续时间:持续时间+输出+延迟
  • 幻灯片:输出
  • 每当事件TS在[窗口结束 - 输出,窗口结束]时触发。这导致只触发一个窗口。

现在的问题是:如何过滤事件以忽略“延迟”之前的事件?我想到了:

  • 如果事件TS在正确的边界之间,则聚合器仅对值求和。这是不可能的,因为Windows中的聚合器不能是RichAggregateFunction,因此我无法访问窗口元数据。 这个假设是否正确?

  • 预先聚合:

    • 典型的减法器
    • RichWindowFunction,它使用托管状态来跟踪在“要忽略的区域”中看到的元素数量,并从收到的聚合器结果中减去该元素。问题是每个窗口不维护getRuntimeContext().getState()因此无法使用。 这个假设是否正确?

我是否缺少任何替代方案或任何假设不正确?

1 个答案:

答案 0 :(得分:1)

我可能在细节上有点迷失,但也许我看到了一个解决方案。

似乎你可以使用在延迟之前和之后两次触发的自定义Trigger。然后使用ProcessWindowFunction with incremental aggregation,并使用per-window state来保存第一次点火的计数(然后再减去)。

鉴于将所有这些放在一起的复杂性,基于ProcessFunction和托管状态的解决方案可能更简单。

相关问题