这些函数都是 Flink 中用于处理流数据的核心操作,每个函数都有其特定的用途和特性:

1. map

  • 功能:对流中的每个元素应用一个映射函数,产生一个新的数据流。
  • 特性
    • 每个输入元素都会被转换为一个新的元素。
    • 结果流的元素个数与输入流相同,但元素类型可能不同。
  • 示例
    1
    2
    DataStream<Integer> numbers = env.fromElements(1, 2, 3);
    DataStream<String> strings = numbers.map(num -> "Number " + num);

2. filter

  • 功能:根据提供的过滤条件筛选数据流中的元素,只有满足条件的元素会被保留。
  • 特性
    • 结果流中的元素是原始流的一个子集。
    • 元素的类型与输入流相同。
  • 示例
    1
    2
    DataStream<Integer> numbers = env.fromElements(1, 2, 3);
    DataStream<Integer> evenNumbers = numbers.filter(num -> num % 2 == 0);

3. flatMap

  • 功能:将每个输入元素映射到零个或多个输出元素,可以生成不同数量的结果。
  • 特性
    • 输入流的每个元素可以产生任意数量的输出元素,包括零个。
    • 适用于需要拆分或扩展数据的场景。
  • 示例
    1
    2
    3
    4
    5
    6
    DataStream<String> lines = env.fromElements("hello world", "foo bar");
    DataStream<String> words = lines.flatMap((line, collector) -> {
    for (String word : line.split(" ")) {
    collector.collect(word);
    }
    });

4. keyBy

  • 功能:将流中的元素根据某个键进行分组,使得具有相同键的元素被分到同一个组中。
  • 特性
    • 结果是一个 KeyedStream,可以在此基础上应用其他操作,如窗口、聚合等。
    • 键可以是任意类型,通常用来在后续操作中进行分组计算。
  • 示例
    1
    2
    3
    DataStream<Tuple2<String, Integer>> stream = env.fromElements(
    new Tuple2<>("apple", 1), new Tuple2<>("banana", 2));
    KeyedStream<Tuple2<String, Integer>, String> keyedStream = stream.keyBy(tuple -> tuple.f0);

5. reduce

  • 功能:对分组后的元素进行归约操作,将一组元素聚合成一个单一的结果。
  • 特性
    • 常用于对每个键的元素进行累加、合并等操作。
    • 需要提供一个归约函数,该函数定义了如何将两个元素合并成一个。
  • 示例
    1
    2
    3
    4
    5
    DataStream<Tuple2<String, Integer>> stream = env.fromElements(
    new Tuple2<>("apple", 1), new Tuple2<>("apple", 2));
    DataStream<Tuple2<String, Integer>> reducedStream = stream
    .keyBy(tuple -> tuple.f0)
    .reduce((t1, t2) -> new Tuple2<>(t1.f0, t1.f1 + t2.f1));

总结

  • **map**:元素逐一转换,输出元素个数与输入相同。
  • **filter**:元素筛选,输出元素个数可能减少。
  • **flatMap**:元素扩展或拆分,输出元素个数可以增加、减少或保持不变。
  • **keyBy**:对数据流进行分组,为后续操作提供分组上下文。
  • **reduce**:对分组后的数据进行聚合操作,生成一个聚合结果。