Flink算子介绍(Datastream篇)
这些函数都是 Flink 中用于处理流数据的核心操作,每个函数都有其特定的用途和特性:
1. map
- 功能:对流中的每个元素应用一个映射函数,产生一个新的数据流。
- 特性:
- 每个输入元素都会被转换为一个新的元素。
- 结果流的元素个数与输入流相同,但元素类型可能不同。
- 示例:
1
2DataStream<Integer> numbers = env.fromElements(1, 2, 3);
DataStream<String> strings = numbers.map(num -> "Number " + num);
2. filter
- 功能:根据提供的过滤条件筛选数据流中的元素,只有满足条件的元素会被保留。
- 特性:
- 结果流中的元素是原始流的一个子集。
- 元素的类型与输入流相同。
- 示例:
1
2DataStream<Integer> numbers = env.fromElements(1, 2, 3);
DataStream<Integer> evenNumbers = numbers.filter(num -> num % 2 == 0);
3. flatMap
- 功能:将每个输入元素映射到零个或多个输出元素,可以生成不同数量的结果。
- 特性:
- 输入流的每个元素可以产生任意数量的输出元素,包括零个。
- 适用于需要拆分或扩展数据的场景。
- 示例:
1
2
3
4
5
6DataStream<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
3DataStream<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
5DataStream<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
**:对分组后的数据进行聚合操作,生成一个聚合结果。
此文章版权归fiefei所有,如有转载,请注明来自原作者
加入大数据创智社团群,群号:303254470