1. Connect
DataStream有两个connect方法:
public ConnectedStreams connect(DataStream dataStream)
public BroadcastConnectedStream connect(BroadcastStream broadcastStream)
前者是与普通DataStream连接,多用于把两个流合并;后者是与一个BroadcastStream连接,多用于受管理数据流的控制
ConnectedStream
该流主要包含两类操作:
- flatMap
public SingleOutputStreamOperator flatMap( CoFlatMapFunction coFlatMapper)
CoFlatMapFunction包含两个方法,flatMap1和flatMap2,分别用于flatmap两个输入流的元素,两者互不相关。如果要使得两个流的数据发生关系,则要对ConnectedStream作keyby,然后使用Keyed status来暂存和处理数据
- process
public SingleOutputStreamOperator process(CoProcessFunction coProcessFunction)
与CoFlatMapFunction类似,CoProcessFunction包含两个方法,processElement1和processElement2,分别用于process两个输入流的元素,两者互不相关。如果要使得两个流的数据发生关系,则要对ConnectedStream作keyby,然后使用Keyed status来暂存和处理数据
此外还提供了TimerService,可以在元素来临时注册定时器,由watermark来触发事件。
BroadcastConnectedStream
该流只包含process操作:
- process
public SingleOutputStreamOperator process(final BroadcastProcessFunction function)
与CoProcessFunction类似,BroadcastProcessFunction包含两个方法,processElement和processBroadcastElement,分别用于process数据流的元素和广播流的元素,两者互不相关。如果要使得两个流的数据发生关系,则要使用BroadcastState
2. Join
DataStream的Join操作:
dataStream1.join(dataStream2)
.where(keySelector1)
.equalTo(keySelector2)
.window(win)
.apply(new JoinFunction / FlatJoinFunction function)
也就是两个流的数据必须:从数据中提取key,只有相同key的元素才能join;并且必须是在窗口中的元素才能join,且连接的方式是类似“Inner Join(内连接)”,也就是必须两个流都有这个key的元素才能join,且两个流中相同key的元素会两两执行function的操作。
- JoinFunction
该类包含一个方法OUT join(IN1 first, IN2 second) ,表示每两个流中的元素生成一个out元素
- FlatJoinFunction
该类包含一个方法void join (IN1 first, IN2 second, Collector
3. CoGroup
DataStream的CoGroup操作:
dataStream1.coGroup(dataStream2)
.where(keySelector1)
.equalTo(keySelector2)
.window(win)
.apply(new CoGroupFunction function)
与join十分类似,也就是两个流的数据必须:从数据中提取key,只有相同key的元素才能coGroup;并且必须是在窗口中的元素才能coGroup。但不同的是coGroup后的数据并不是两两作用function,而是将同一个window内两个流中所有相同key的数据都放到一起处理:
- CoGroupFunction
该类包含一个方法void coGroup(Iterable
4. Interval Join
DataStream的Interval Join操作:
dataStream1.keyBy(keySelector1)
.intervalJoin(dataStream2.keyBy(keySelector2))
.between(Time.milliseconds(-2), Time.milliseconds(1))
.process (new ProcessJoinFunction function)
与普通Join不同的是,并不是在window内的元素join,而是dataStream1中元素与其前后若干时间区间的dataStream2的元素join
- ProcessJoinFunction
该类包含一个方法void processElement(IN1 left, IN2 right, Context ctx, Collector
总结:
相同点:
都是将两个流合成一个流不同点:
Connect:两个流的数据不一定要发生关系,可以各自单独处理、单独输出,但是输出的结果会合并成一个流。也可以使一个流不输出数据,而仅仅作为另一个流的控制状态。如果要使两个流的数据发生关系,则必须使用state
Join/CoGroup:两个流之间的数据会发生某种关联,需要对两个流的数据抽取key,并且加窗,将窗内的同key数据进行处理,共同生成新的流元素