【Flink-1.17-教程】-【四】Flink DataStream API(6)转换算子(Transformation)【合流】
在实际应用中,我们经常会遇到来源不同的多条流,需要将它们的数据进行联合处理。所以 Flink 中合流的操作会更加普遍,对应的 API 也更加丰富。
1)联合(Union)
最简单的合流操作,就是直接将多条流合在一起,叫作流的“联合”(union)
。联合操作要求必须流中的数据类型必须相同,合并之后的新流会包括所有流中的元素,数据类型不变。
在代码中,我们只要基于 DataStream 直接调用 .union() 方法,传入其他 DataStream 作为参数,就可以实现流的联合了;得到的依然是一个 DataStream:
stream1.union(stream2, stream3, ...)
注意:union() 的参数可以是多个 DataStream,所以联合操作可以实现多条流的合并。
代码实现: 我们可以用下面的代码做一个简单测试:
public class UnionDemo {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
DataStreamSource<Integer> source1 = env.fromElements(1, 2, 3);
DataStreamSource<Integer> source2 = env.fromElements(11, 22, 33);
DataStreamSource<String> source3 = env.fromElements("111", "222", "333");
/**
* TODO union:合并数据流
* 1、 流的数据类型必须一致
* 2、 一次可以合并多条流
*/
// DataStream<Integer> union = source1.union(source2).union(source3.map(r -> Integer.valueOf(r)));
DataStream<Integer> union = source1.union(source2, source3.map(r -> Integer.valueOf(r)));
union.print();
env.execute();
}
}
要点:
1、流的数据类型必须一致。
2、一次可以合并多条流。
2)连接(Connect)
2.1.连接流(ConnectedStreams)
流的联合虽然简单,不过受限于数据类型不能改变,灵活性大打折扣,所以实际应用较少出现。除了联合(union)
,Flink 还提供了另外一种方便的合流操作——连接(connect)
。
代码实现: 需要分为两步:首先基于一条 DataStream 调用 .connect() 方法,传入另外一条 DataStream 作为参数,将两条流连接起来,得到一个 ConnectedStreams;然后再调用同处理方法得到 DataStream。这里可以的调用的同处理方法有 .map() / .flatMap(),以及 .process() 方法。
public class ConnectDemo {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);