1.Interval Joins(区间Join)
区间是双流join的优化,基于处理时间或事件时间,在一定时间区间内数据,相同的key进行join(支持 Batch\Streaming)。Interval Join 可以让一条流去 Join 另一条流中前后一段时间内的数据。
对于stream查询,时间区间join只支持有时间属性的 append-only表。由于时间属性是准单调递增的,Flink可以从其状态中删除旧值,而不会影响结果的正确性。
优点:由于给定了关联的区间,因此只需要保留很少的状态,内存压力较小。
缺点:如果关联的数据晚到或者早到,导致落不到 JOIN 区间内,就可能导致结果不准确。只支持普通 Append 数据流,不支持含 Retract 的动态表。支持事件时间和处理时间
区间join支持基本特征如下:
- 支持INNER、LEFT、RIGHT、FULL OUT JOIN
- 语义语法和传统sql join一致
- 左右流都会触发更新
- state根据时间区间保留,自动清理
- 输出流保留时间属性
2.语法
语法和sql join一致。
SELECT * FROM Orders
[INNER|RIGHT|LEFT|FULL OUTER] JOIN Product
ON Orders.productId = Product.id
区别在于join连接条件,有效的join连接条件如下:
- ltime = rtime
- ltime >= rtime AND ltime < rtime + INTERVAL '10' MINUTE
- ltime BETWEEN rtime - INTERVAL '10' SECOND AND rtime + INTERVAL '5' SECOND
3.Interval Join实例
如果订单在收到订单10小时后发货,则此查询将把所有订单与其相应的发货联系起来
# 两表有时间戳字段,并且作为 watermark。或者使用PROCTIME() 函数来生成一个处理时间戳
SELECT *
FROM Orders o, Shipments s
WHERE o.id = s.order_id
AND o.order_time BETWEEN s.ship_time - INTERVAL '10' HOUR AND s.ship_time
文章来源:https://www.toymoban.com/news/detail-488074.html
总的来说,Interval join 主要用于处理时间序列数据的场景,在 join 操作时需要在时间窗口内匹配数据;而 Regular join 主要用于一般的数据 join 操作。Interval join处理更高效,可定时清除状态数据,性能更好。实际开发中,需要考虑具体业务场景、流表数据大小及更新频率、源数据是否有时间属性等因素,选择适合的方式。文章来源地址https://www.toymoban.com/news/detail-488074.html
到了这里,关于Flink SQL之Interval Joins的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!