Joining

Window Join 窗口连接


window join 用于指定位于同一个窗口、包含同一个 key 的两个流的元素进行合并。

stream.join(otherStream)
    .where(<KeySelector>)
    .equalTo(<KeySelector>)
    .window(<WindowAssigner>)
    .apply(<JoinFunction>)

Tumbling Window Join 滚动窗口连接

当执行滚动窗口连接时,所有具有共同的 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;
        }
    });

Sliding Window Join 滑动窗口连接

在这个例子中,我们使用的是大小为 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;
        }
    });

Session Window Join 会话窗口连接