window join 用于指定位于同一个窗口、包含同一个 key 的两个流的元素进行合并。
stream.join(otherStream)
.where(<KeySelector>)
.equalTo(<KeySelector>)
.window(<WindowAssigner>)
.apply(<JoinFunction>)
当执行滚动窗口连接时,所有具有共同的 key 和共同的 tumbing window 的元素都会以成对组合的方式进行连接,并传递给 JoinFunction 或 FlatJoinFunction。
因为这表现得像一个内部连接,所以一个流的元素如果在其 tumbling window 中没有来自另一个流的元素,就不会被连接进去。
如图所示,我们定义了一个大小为 2 ms 的滚动窗口,其结果是 [0,1],[2,3],... 形式的窗口。图中显示了每个窗口中所有元素的配对组合,这些元素将被传递给 JoinFunction。在滚动窗口 [6,7] 中,没有任何元素发出,因为绿色流中没有元素存在,要与橙色元素⑥和⑦结合。
DataStream<Integer> orangeStream = ...
DataStream<Integer> greenStream = ...
orangeStream.join(greenStream)
.where(<KeySelector>)
.equalTo(<KeySelector>)
.window(TumblingEventTimeWindows.of(Time.milliseconds(2)))
.apply (new JoinFunction<Integer, Integer, String> (){
@Override
public String join(Integer first, Integer second) {
return first + "," + second;
}
});
在这个例子中,我们使用的是大小为 2ms 的滑动窗口,并将它们滑动 1ms,结果是滑动窗口[-1,0],[0,1],[1,2],[2,3],......。x轴下面的加入元素就是每个滑动窗口传递给JoinFunction的元素。这里你也可以看到,例如橙色的②与绿色的③在窗口[2,3]中连接,但与窗口[1,2]中的任何元素都没有连接。
DataStream<Integer> orangeStream = ...
DataStream<Integer> greenStream = ...
orangeStream.join(greenStream)
.where(<KeySelector>)
.equalTo(<KeySelector>)
.window(SlidingEventTimeWindows.of(Time.milliseconds(2) /* size */, Time.milliseconds(1) /* slide */))
.apply (new JoinFunction<Integer, Integer, String> (){
@Override
public String join(Integer first, Integer second) {
return first + "," + second;
}
});