文章目录
前言
1. 分流
将一条数据流拆分成完全独立的两条、甚至多条流,直接用处理函数(process function)的侧输出流(side output)即可

public class SplitStreamByOutputTag {
private static OutputTag<Tuple3<String, String, Long>> MaryTag = new OutputTag<Tuple3<String, String, Long>>("Mary-pv") {
};
private static OutputTag<Tuple3<String, String, Long>> BobTag = new OutputTag<Tuple3<String, String, Long>>("Bob-pv") {
};
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
SingleOutputStreamOperator<Event> stream = env.addSource(new ClickSource());
SingleOutputStreamOperator<Event> processedStream = stream.process(new ProcessFunction<Event, Event>() {
@Override
public void processElement(Event value, Context ctx, Collector<Event> out) throws Exception {
if (value.user.equals("Mary")) {
ctx.output(MaryTag, new Tuple3<>(value.user, value.url, value.timestamp));
} else if (value.user.equals("Bob")) {
ctx.output(BobTag, new Tuple3<>(value.user, value.url, value.timestamp));
} else {
out.collect(value);
}
}
});
processedStream.getSideOutput(MaryTag).print("Mary pv");
processedStream.getSideOutput(BobTag).print("Bob pv");
processedStream.print("else");
env.execute();
}
}
2. 合流
2.1 联合(Union)
联合操作要求必须流中的数据类型必须相同,合并之后的新流会包括所有流中的元素,数据类型不变

stream1.union(stream2, stream3, ...)
注意:
对于合流之后的水位线,以最小的watermark为准,才可以保证所有流都不会再传来水位线之前的数据
public class UnionExample {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
SingleOutputStreamOperator<Event> stream1 = env.socketTextStream("192.168.0.23", 7777)
.

本文详细介绍了Apache Flink中数据流的处理,包括如何进行分流,如使用ProcessFunction的侧输出流实现按用户拆分数据流;以及合流操作,如联合(Union)、连接(Connect)及其子类型,如ConnectedStreams和CoProcessFunction的应用,展示了如何在双流中进行事件时间的对账。此外,还提到了广播连接流(BroadcastConnectedStream)在处理动态规则时的作用。
最低0.47元/天 解锁文章
1673

被折叠的 条评论
为什么被折叠?



