Flink实战双流join之intervalJoinconnect和join的区别
Apache Flink.png
通俗易懂篇:
前⾯学习的Window Join必须要在⼀个Window中进⾏JOIN,那如果没有Window如何处理呢?
interval join也是使⽤相同的key来join两个流(流A、流B),并且流B中的元素中的时间戳,和流A元素的时间戳,有⼀个时间间隔。也就是:流B的元素的时间戳 ≥ 流A的元素时间戳 + 下界,且流B的元素的
时间戳 ≤ 流A的元素时间戳 + 上界。
我们来看Flink官⽅的⼀张图。
image
我们看到,流A的每⼀个元素,都会和流B的⼀定时间范围的元素进⾏JOIN。
其中,上界和下界可以是负数,也可以是整数。Interval join⽬前只⽀持INNER JOIN。将连接后的元素传递给ProcessJoinFunction时,时间戳变为两个元素中最⼤的那个时间戳。
注意:
Interval Join只⽀持事件时间。
image.png
运⾏结果:
image.png
深挖原理篇:
join() 和 coGroup() 都是基于窗⼝做关联的。但是在某些情况下,两条流的数据步调未必⼀致。例如,订单流的数据有可能在点击流的购买动作发⽣之后很久才被写⼊,如果⽤窗⼝来圈定,很容易 join 不上。所以 Flink ⼜提供了"Interval join"的语义,按照指定字段以及右流相对左流偏移的时间区间进⾏关联。interval join 也是 inner join,虽然不需要开窗,但是需要⽤户指定偏移区间的上下界,并且只⽀持事件时间。
按照指定字段以及右流相对左流偏移的时间区间进⾏关联,即:
right.timestamp ∈ [left.timestamp + lowerBound; left.timestamp + upperBound]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。