将元素折叠成值

Folding elements into values

我需要将键值元素的无限 PCollection 折叠到每个键的聚合中(在应用每个输入后输出聚合)。以正确的顺序折叠值很重要,而且自定义组合器似乎不支持这一点。每个键的吞吐量将非常低,但整体吞吐量将非常高。我可以在 Dataflow 中执行此操作吗?

正确,组合器是无序的。这是因为无序组合在允许延迟数据的 Beam 模型中很有意义(如果延迟数据到达,您希望在您的情况下有什么行为?),并且因为它承认非常有效的实现,并且在大多数情况下,这就是所需要的。

为您的案例解决此问题的一种方法(牺牲一些效率)是实现自定义 CombineFn,其中:

  • 累加器以及输出类型是"list of input elements sorted by timestamp"。
  • 将元素插入累加器会将其插入排序列表
  • 合并两个累加器会合并排序列表。
  • 从累加器中提取输出是恒等函数。

基本上,您将使用 Combine 为每个键维护一个排序的值列表,您将得到一个 PCollection<KV<K, List<V>>>,您可以在折叠时应用 ParDo