2016-07-06 74 views
1

比方说,我有一个由用户ID键入的句子无限pcollection,我想不断更新的值是否用户是烦人的,我们可以计算出用户是否讨厌通过所有的他们曾经对功能说过的句子是Annoying()。永远。删除跨窗口触发器/发射重复

我的窗口设置为全局与触发器afterElement(1),accumulatingFiredPanes(),做GroupByKey,然后有一个帕尔发出的用户ID,isAnnoying

这工作永远,不断积累为每个用户等的状态。除了绝大多数时候新句子不改变,无论用户是否是Annoying,并且窗口大部分时间触发并发出用户ID,isAnnoying元组都是冗余更新,并且io是不必要的。如何捕获这些重复的更新,并在每次进入一个句子时仍然得到更新,这会改变isAnnoying值?

+0

参见http://stackoverflow.com/questions/38297821/detecting-keyed-state-changes –

回答

1

今天没有办法直接表达“仅当组合结果发生变化时输出”。

根据您的流水线,您可以应用一种方法来减少数据量:使用.discardingFiredPanes(),然后使用GroupByKey并立即使用过滤器来删除任何零值,其中“零”表示您的身份元素CombineFn。我使用的关联性要求Combine这一事实意味着您必须能够独立计算句子的增量“恼人”,而无需参考历史记录。

BEAM-23(对于ParDo的交叉绑定可变的每个键和窗口状态)被实现时,您将能够手动维护状态并实现这种“当结果改变时只发送输出”逻辑。

但是,我认为这种情况可能值得在模型中明确考虑。它融合了今天由triggersaccumulation mode体现的概念。