首页 > 解决方案 > 是否可以获得给定键的前一个窗口的状态

问题描述

我有事件(ProductOrderRequested、ProductColorChanged、ProductDelivered...),我想为我的产品建立一个黄金记录。

但是我的目标是逐步建立黄金记录:每次活动都会给我一个更新的产品状态,我需要存储每个版本的状态以用于可追溯性目的

我有一个非常简单的管道(代码胜于文字):

events
 .apply("SessionWindow", Window.
          <KV<String, Event>>into(Sessions.withGapDuration(gapSession)
          .triggering(<early and late data trigger>))
 .apply("GroupByKey", GroupByKey.create())
 .apply("ComputeState", ParDo.of(new StatefulFn()))

我的问题是对于给定的窗口,我必须根据以下内容计算新状态:

  1. 前一个状态(即前一个窗口的计算状态)
  2. 收到的事件

我想避免调用外部服务来获取以前的状态,而是获取上一个窗口的状态。有可能吗?

标签: apache-beamdataflow

解决方案


在 Apache Beam 中,状态始终按窗口限定(另请参阅此答案)。所以我只能考虑重新窗口化到全局窗口并处理那里的状态。在这个全局StatefulFn中,您可以存储和处理先前的状态。

然后它看起来像这样:

events
 .apply("SessionWindow", Window.
          <KV<String, Event>>into(Sessions.withGapDuration(gapSession)
          .triggering(<early and late data trigger>))
 .apply("GroupByKey", GroupByKey.create())
 .apply("Re-window into Global Window", Window.
          <KV<String, Event>>into(new GlobalWindows())
          .triggering(<early and late data trigger>))
 .apply("ComputeState", ParDo.of(new StatefulFn()))

另请注意,截至目前,Apache Beam 不支持用于合并窗口的状态处理(请参阅此问题)。因此,StatefulFn当您的触发器发出会话窗口的早期或晚期结果时,您的会话窗口基础将无法正常工作,因为状态未合并。这是使用像全局窗口这样的非合并窗口的另一个原因。


推荐阅读