window join用于连接两个流的元素,他们在一个窗口钟用于共享一个公共的key.我们一般可以用一个窗口分配器定义这些窗口(join情况下一般包含了Tumbling Windows (滚动)、Sliding Windows(滑动)和Session Windows (会话窗口))

Windows Join的代码一般形式如下:

flink 会话窗口 flink window join_flink


注:创建两个流元素的成对组合的行为类似于内连接。如果来自一个流的元素和另一个流没有相对应的连接元素,则不会发出该元素。

结合在一起的那些元素将其时间戳设置为各自窗口的最大时间戳。例如,以[5,10]为边界的窗口将产生连接的元素的时间戳为9。

结合

第一种:Tumbling Window Join(滚动时间窗口join)

执行滚动窗口连接时,**具有公共key和公共tumbling window的所有的元素都已成对的组合形式进行连接,并传递给joinfunction或flatjoinfunction。**因为这就像一个内链接,在滚动窗口中没有来自另一个流的元素的流的元素不会被输出

flink 会话窗口 flink window join_滑动窗口_02

如图所示:们定义了一个大小为2毫秒的滚动窗口,其结果为[0,1],[2,3], …。该图像显示了每个窗口中所有元素的成对组合,这些元素将传递给JoinFunction。注意,在翻滚窗口[6,7]中没有发出任何内容,因为在绿色流中没有元素与橙色元素⑥、⑦连接。

注意:这个joinFunction 进行便利会出现4个值(第一个窗口为例子)0->0 ,0->1 ,1->0 ,1->0 ,

既(0,0 0,1 1,0 1,1) 四种结果

例子程序如下:

flink 会话窗口 flink window join_时间戳_03

第二种 :Sliding Window Join (滑动窗口) 窗口直接可以重合

flink 会话窗口 flink window join_flink_04


我们使用的滑动窗口大小为2毫秒,滑动1毫秒,x轴以下是每个滑动窗口的Join结果。在这里你还可以看到橙②与绿色③窗口Join(2、3),但不与任何窗口Join[1,2].

具体的代码程序为:

flink 会话窗口 flink window join_flink 会话窗口_05


第三种:Session Window Join 事件join 窗口

在执行会话窗口连接时,具有相同键的所有元素(当“组合”时满足会话条件)都以成对的组合进行连接,并传递给JoinFunction或FlatJoinFunction。再次执行内部连接,因此如果会话窗口只包含来自一个流的元素,则不会发出任何输出!

flink 会话窗口 flink window join_flink 会话窗口_06


在这里,定义一个会话窗口连接,其中每个会话被至少1ms的间隔所分割。有三个会话,在前两个会话中,来自两个流的连接元素被传递给JoinFunction。在第三次会话中绿色流没有元素,所以⑧⑨不会Join。

例子代码程序为:

flink 会话窗口 flink window join_Windows_07


注意:综上我们可以知道window join 的逻辑步骤为

1、窗口内过滤具有公共key的所有的元素都已成对的组合形式进行连接,

2、传递给joinfunction或flatjoinfunction然后执行操作