合并
Javadoc用户定义的 CombineFn
可以应用于将 PCollection
中的所有元素合并为单个值(全局合并),或将与每个键关联的所有元素合并为单个值。
虽然结果类似于应用 GroupByKey
然后聚合每个 Iterable
中的值,但你必须编写的代码以及管道的性能都会受到影响。编写一个计算每个值中元素数量的 ParDo
会非常简单。但是,正如执行模型中所述,它还需要由单个工作器处理与每个键关联的所有值。这会引入大量通信开销。使用 CombineFn
需要将代码结构化为关联和交换操作。但是,它允许使用部分和进行预计算。
在 Beam 编程指南 中查看更多信息。
示例
示例 1:全局合并
使用全局合并将给定 PCollection
中的所有元素合并为单个值,在你的管道中表示为包含一个元素的新 PCollection
。以下示例代码展示了如何应用 Beam 提供的求和合并函数,为 PCollection
中的整数生成单个求和值。
示例 2:按键合并
使用按键合并将与每个键关联的所有值合并为每个键的单个输出值。与全局合并一样,传递给按键合并的函数必须是关联的和可交换的。
// PCollection is grouped by key and the Double values associated with each key are combined into a Double.
PCollection<KV<String, Double>> salesRecords = ...;
PCollection<KV<String, Double>> totalSalesPerPerson =
salesRecords.apply(Combine.<String, Double, Double>perKey(
new Sum.SumDoubleFn()));
// The combined value is of a different type than the original collection of values per key. PCollection has
// keys of type String and values of type Integer, and the combined value is a Double.
PCollection<KV<String, Integer>> playerAccuracy = ...;
PCollection<KV<String, Double>> avgAccuracyPerPlayer =
playerAccuracy.apply(Combine.<String, Integer, Double>perKey(
new MeanInts())));
示例 3:
相关转换
最后更新于 2024/10/31
你找到你想要的所有内容了吗?
它是否对你有用且清晰?有没有你想改变的地方?请告诉我们!