07-Flink 规约函数和 aggreagte 的区别

Flink 官网主页地址:https://flink.apache.org
Flink 官方中文地址:https://nightlies.apache.org/flink/flink-docs-stable/zh/

键控流(Keyed Streams)reduce 和 aggregate 的区别。

操作定义与功能:

  • reduce:reduce 操作是将两个输入元素合并为一个元素的操作。在 Flink 中,当应用于键控流时,reduce 操作会将具有相同键的两个元素合并为一个,直到每个键只对应一个元素为止。这个过程是迭代的,即每次迭代都将上一步的结果与当前元素合并。
  • aggregate:aggregate 操作是将多个输入元素转化为单个元素的操作,但它与 reduce 的主要区别在于其可以处理多个元素,而不仅仅是两个。在 Flink 中,aggregate 操作通常是通过实现 AggregateFunction 接口来定义的,它允许用户自定义聚合逻辑,以实现对一组键的元素的聚合计算。

处理逻辑:

  • reduce:处理逻辑相对简单,主要关注两个元素之间的合并操作。在 Flink 中,可以使用 KeyedStream.reduce() 方法来应用 reduce 操作,并传入一个实现了 ReduceFunction 接口的函数,该函数定义了如何合并两个元素。
  • aggregate:处理逻辑更加灵活和复杂,因为它可以处理多个元素。在 Flink 中,可以使用 KeyedStream.aggregate() 方法来应用 aggregate 操作,并传入一个实现了 AggregateFunction 接口的函数,该函数定义了如何对一组元素进行聚合计算。

结果输出:

  • reduce:由于 reduce 操作是迭代的,并且每次迭代都将上一步的结果与当前元素合并,因此最终输出将是一个包含单个元素的流,每个键对应一个元素。
  • aggregate:aggregate 操作的结果取决于用户定义的聚合逻辑。通常,它会输出一个包含聚合结果的流,其中每个键对应一个聚合结果。这个结果可以是一个简单的值(如计数、总和等),也可以是一个更复杂的对象(如直方图、统计信息等)。

适用场景:

  • reduce:适用于简单的、基于两个元素之间的合并操作的场景,如累加、求最大值等。
  • aggregate:适用于需要更复杂的聚合计算的场景,如计算平均值、中位数、众数等,或者需要对多个元素进行更复杂的组合或转换的场景。

总结来说,Flink中的reduce和aggregate操作在键控流处理中扮演着不同的角色。reduce关注于两个元素之间的合并操作,而aggregate则提供更灵活的聚合计算功能,可以处理多个元素并返回更复杂的聚合结果。在实际应用中,应根据具体需求选择合适的操作来处理数据


07-Flink 规约函数和 aggreagte 的区别
https://flepeng.github.io/044-Flink-42-核心概念-07-Flink-规约函数和-aggreagte-的区别/
作者
Lepeng
发布于
2021年3月8日
许可协议