将元素折叠成值
Folding elements into values
我需要将键值元素的无限 PCollection 折叠到每个键的聚合中(在应用每个输入后输出聚合)。以正确的顺序折叠值很重要,而且自定义组合器似乎不支持这一点。每个键的吞吐量将非常低,但整体吞吐量将非常高。我可以在 Dataflow 中执行此操作吗?
正确,组合器是无序的。这是因为无序组合在允许延迟数据的 Beam 模型中很有意义(如果延迟数据到达,您希望在您的情况下有什么行为?),并且因为它承认非常有效的实现,并且在大多数情况下,这就是所需要的。
为您的案例解决此问题的一种方法(牺牲一些效率)是实现自定义 CombineFn,其中:
- 累加器以及输出类型是"list of input elements sorted by timestamp"。
- 将元素插入累加器会将其插入排序列表
- 合并两个累加器会合并排序列表。
- 从累加器中提取输出是恒等函数。
基本上,您将使用 Combine 为每个键维护一个排序的值列表,您将得到一个 PCollection<KV<K, List<V>>>
,您可以在折叠时应用 ParDo
。
我需要将键值元素的无限 PCollection 折叠到每个键的聚合中(在应用每个输入后输出聚合)。以正确的顺序折叠值很重要,而且自定义组合器似乎不支持这一点。每个键的吞吐量将非常低,但整体吞吐量将非常高。我可以在 Dataflow 中执行此操作吗?
正确,组合器是无序的。这是因为无序组合在允许延迟数据的 Beam 模型中很有意义(如果延迟数据到达,您希望在您的情况下有什么行为?),并且因为它承认非常有效的实现,并且在大多数情况下,这就是所需要的。
为您的案例解决此问题的一种方法(牺牲一些效率)是实现自定义 CombineFn,其中:
- 累加器以及输出类型是"list of input elements sorted by timestamp"。
- 将元素插入累加器会将其插入排序列表
- 合并两个累加器会合并排序列表。
- 从累加器中提取输出是恒等函数。
基本上,您将使用 Combine 为每个键维护一个排序的值列表,您将得到一个 PCollection<KV<K, List<V>>>
,您可以在折叠时应用 ParDo
。