apache-beam - 是否可以获得给定键的前一个窗口的状态
问题描述
我有事件(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()))
我的问题是对于给定的窗口,我必须根据以下内容计算新状态:
- 前一个状态(即前一个窗口的计算状态)
- 收到的事件
我想避免调用外部服务来获取以前的状态,而是获取上一个窗口的状态。有可能吗?
解决方案
在 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
当您的触发器发出会话窗口的早期或晚期结果时,您的会话窗口基础将无法正常工作,因为状态未合并。这是使用像全局窗口这样的非合并窗口的另一个原因。
推荐阅读
- angular - 如何以角度实现刷新令牌?
- javascript - 类型错误:pokemon.map 不是函数
- angular - 如何再次将 ngFor 中的所有对象作为数组提交?
- shell - 用于从任意随机目录创建目录的 Shell 脚本
- postgresql - 使用 sqlx 批量插入
- python - 通过乘法参数过滤字典列表
- swiftui - 如何将 NavigationLink 实现为 Button(action: { })
- javascript - 为什么使用 style.backgroundColor 时背景颜色没有改变?
- mysql - 在mysql中对多列求和并求和它们的别名
- javascript - 当我将文本换成图标时,Javascript 切换功能崩溃