Join

flink 的 join 支持多种类型:

  • 双流 Join(Regular Join)。
  • Interval Join
  • 窗口关联(Window Join)
  • Temporal Join
  • Lookup Join

参考资料:

Regular Join

文档介绍:Regular Joins

Regular Join 是最常见的 join 类型。当 join 的两张表的任何数据发生变更,都会影响 join 结果。不只是未处理的数据 join 结果发生变更,之前已经处理过的数据也会重新触发计算重新输出结果。

SELECT * FROM Orders
INNER JOIN Product
ON Orders.productId = Product.id

Flink 的 join 和传统批处理 join 的语义一致,都用于将两张表关联起来。区别为实时计算关联的是两张动态表,关联的结果需动态更新,以保证最终结果和批处理结果一致。

为了实现 join 结果的最终一致性,Flink 会保存两张表的所有数据的最新状态至状态中,如果数据条数无限增长会导致状态无限增加。用户可以为状态添加 time-to-live (TTL) 避免状态无限增长。

比如直播电商公司准备直播带货时,最早上午 08:00 开始,最晚凌晨 03:00 结束,那么相关表的 join 时,可以设置 TTL 为 48h,超过 48h 仍然有直播数据变更的可能性非常低,即使仍然有数据过来,也属于异常数据。

设置 TTL 时需充分考虑到表数据的实际变更情况,上述案例如果设置为 3h 就会因为数据的状态过期被清除导致结果错误。

TTL 设置参考 Idle State Retention Time

Flink 支持 INNER Join 和 OUTER Join,且只支持相等联接,即至少有一个连接条件是相等谓词的联接。

INNER Join

SELECT *
FROM Orders
INNER JOIN Product
ON Orders.product_id = Product.id

OUTER Join

包括 LEFT,RIGHT,FULL Join。

-- LEFT Join
SELECT *
FROM Orders
LEFT JOIN Product
ON Orders.product_id = Product.id

-- RIGHT Join
SELECT *
FROM Orders
RIGHT JOIN Product
ON Orders.product_id = Product.id

-- FULL OUTER Join
SELECT *
FROM Orders
FULL OUTER JOIN Product
ON Orders.product_id = Product.id

Temporal Join

Lookup Join

维表查询