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



我试图构建一个类似窗口的东西,它的行为类似于滑动窗口,并且:

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

窗口的参数为:

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

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

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

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

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

  • 具有预聚合:

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

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

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

似乎您可以使用在延迟之前和之后触发两次的自定义触发器。然后使用具有增量聚合的 ProcessWindowFunction,并使用每个窗口状态来保存第一次触发的计数(然后

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

相关内容

  • 没有找到相关文章

最新更新