我试图构建一个类似窗口的东西,它的行为类似于滑动窗口,并且:
- 计算事件,忽略自窗口结束到某个"延迟"> 的事件
- 每个事件触发一次且仅触发一次
- [事件 TS - 延迟 - 持续时间 , 事件 TS - 延迟] 中的事件的输出计数
- 使用预聚合来避免保存所有事件。
窗口的参数为:
持续时间- :窗口的持续时间
- 输出:要触发的事件的偏移量,从窗口末尾开始计数。类似于"幻灯片"。
- 延迟:要忽略的事件的偏移量,从窗口末尾开始计数。基本上忽略事件,例如时间戳<=窗口结束-滑动-延迟。
我正在尝试的想法涉及有一个滑动窗口:
持续时间- :持续时间 + 输出 + 延迟
- 幻灯片:输出
- 每当事件 TS 处于 [窗口端 - 输出,窗口端] 时触发。这只会导致一个窗口触发。
现在的问题是:如何过滤事件以忽略"延迟"之前的事件?我想到了:
具有一个聚合器,该聚合器仅在事件 TS 在正确边界之间时对值求和。这是不可能的,因为窗口中的聚合器不能是
RichAggregateFunction
,因此我无法访问窗口元数据。这个假设正确吗?具有预聚合:
- 典型减和器
- RichWindowFunction,它使用托管状态来跟踪在"要忽略的区域"中看到的元素数,并从收到的聚合器结果中减去该元素数。问题是
getRuntimeContext().getState()
不是按窗口维护的,因此无法使用。这个假设正确吗?
我是否缺少任何替代方案,或者任何假设不正确?
我可能有点迷失在细节中,但也许我看到了解决方案。
似乎您可以使用在延迟之前和之后触发两次的自定义触发器。然后使用具有增量聚合的 ProcessWindowFunction,并使用每个窗口状态来保存第一次触发的计数(然后
减去(。考虑到将所有这些放在一起的复杂性,基于 ProcessFunction 和托管状态的解决方案可能更简单。