删除 window triggers/firings 中的重复项

Remove duplicates across window triggers/firings

假设我有一个由 userid 键入的无限句子集合,我想要一个不断更新的用户是否烦人的值,我们可以通过传递他们曾经说过的所有句子来计算用户是否烦人对函数 isAnnoying() 说。永远.

我将 window 设置为全局触发器 afterElement(1),accumulatingFiredPanes(),执行 GroupByKey,然后有一个发出 userid 的 ParDo,isAnnoying

这永远有效,不断累积每个用户的状态等。除了事实证明绝大多数时间一个新句子不会改变用户是否烦人,所以大多数时候 window 触发并发出一个 userid,isAnnoying tuple 这是一个冗余更新,io 是不必要的。我如何捕获这些重复的更新并删除,同时在每次出现确实更改 isAnnoying 值的句子时仍然获得更新?

今天没办法直接表达"output only when the combined result has changed".

您可以应用一种方法来减少数据量,具体取决于您的管道:使用 .discardingFiredPanes(),然后在 GroupByKey 之后使用立即过滤器删除任何零值,其中"zero" 表示您的 CombineFn 的标识元素。我使用的事实是 Combine 的结合性要求意味着您必须能够在不参考历史记录的情况下独立计算句子的增量 "annoying-ness"。

BEAM-23ParDo 的跨包可变每个键和 window 状态)实现时,您将能够手动维护状态并实现它你自己有点 "only send output when the result changes" 逻辑。

但是,我认为这种情况可能值得在模型中明确考虑。它融合了今天 triggers and the accumulation mode.

所体现的概念