返回

Flink基础API系列四:转换算子(Transformation)揭秘数据流变换之道

后端

Flink 基础API 系列四:转换算子(Transformation)

4.3 转换算子(Transformation)概述

用户通过算子能将一个或多个 DataStream 转换成新的 DataStream,在应用程序中可以将多个数据转换算子合并成逻辑上类似于管道的数据流网络。

转换算子大致分为两类:单输入算子和多输入算子。顾名思义,单输入算子只接受一个输入 DataStream,而多输入算子可以接受多个输入 DataStream。

4.3.1 单输入算子

单输入算子是最常见的转换算子类型。它们只接受一个输入 DataStream,并将其转换为一个新的 DataStream。一些常见的单输入算子包括:

  • map():将每个元素应用于一个函数,并生成一个新的元素。
  • filter():根据一个谓词过滤元素,只保留满足谓词的元素。
  • flatMap():将每个元素应用于一个函数,并生成零个或多个新元素。
  • keyBy():根据一个键对元素进行分组,以便对分组内的元素进行处理。
  • reduce():将元素归并为一个单一的值。

4.3.2 多输入算子

多输入算子可以接受多个输入 DataStream,并将它们合并成一个新的 DataStream。一些常见的多输入算子包括:

  • union():将两个或多个 DataStream 合并成一个新的 DataStream。
  • join():根据一个键将两个或多个 DataStream 中的元素连接起来。
  • coGroup():将两个或多个 DataStream 中的元素分组,以便对分组内的元素进行处理。

4.4 转换算子示例

为了更好地理解转换算子,我们来看几个示例。

4.4.1 单输入算子示例

以下示例演示了如何使用 map() 算子将每个元素应用于一个函数,并生成一个新的元素:

DataStream<Integer> dataStream = ...;

DataStream<String> stringStream = dataStream.map(new MapFunction<Integer, String>() {
  @Override
  public String map(Integer value) {
    return value.toString();
  }
});

4.4.2 多输入算子示例

以下示例演示了如何使用 union() 算子将两个或多个 DataStream 合并成一个新的 DataStream:

DataStream<Integer> dataStream1 = ...;
DataStream<Integer> dataStream2 = ...;

DataStream<Integer> mergedStream = dataStream1.union(dataStream2);

4.5 转换算子注意事项

在使用转换算子时,需要注意以下几点:

  • 转换算子是懒惰求值的。这意味着它们不会在创建时执行,而是在调用 execute() 方法时执行。
  • 转换算子是不可变的。这意味着一旦创建了一个转换算子,就不能再对其进行修改。
  • 转换算子可以组合使用。这意味着可以将多个转换算子连接起来,形成一个逻辑上类似于管道的网络。

4.6 小结

转换算子是 Flink 中用于转换数据流的基本算子。它们可以分为单输入算子和多输入算子。单输入算子只接受一个输入 DataStream,而多输入算子可以接受多个输入 DataStream。转换算子是懒惰求值的,不可变的,并且可以组合使用。