合并

Javadoc Javadoc


用户定义的 CombineFn 可以应用于将 PCollection 中的所有元素合并为单个值(全局合并),或将与每个键关联的所有元素合并为单个值。

虽然结果类似于应用 GroupByKey 然后聚合每个 Iterable 中的值,但你必须编写的代码以及管道的性能都会受到影响。编写一个计算每个值中元素数量的 ParDo 会非常简单。但是,正如执行模型中所述,它还需要由单个工作器处理与每个键关联的所有值。这会引入大量通信开销。使用 CombineFn 需要将代码结构化为关联和交换操作。但是,它允许使用部分和进行预计算。

Beam 编程指南 中查看更多信息。

示例

示例 1:全局合并

使用全局合并将给定 PCollection 中的所有元素合并为单个值,在你的管道中表示为包含一个元素的新 PCollection。以下示例代码展示了如何应用 Beam 提供的求和合并函数,为 PCollection 中的整数生成单个求和值。

// Sum.SumIntegerFn() combines the elements in the input PCollection. The resulting PCollection, called sum,
// contains one value: the sum of all the elements in the input PCollection.
PCollection<Integer> pc = ...;
PCollection<Integer> sum = pc.apply(
   Combine.globally(new Sum.SumIntegerFn()));

示例 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: