更新时间:2024-12-09 GMT+08:00

Flink Stream SQL Join增强

Flink的Table API&SQL是一种用于Scala和Java的语言集成式查询API,它支持非常直观的从关系运算符(如选择、筛选和连接)进行组合查询。Table API&SQL详细内容请参见官网:https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/table/index.html

Stream SQL Join介绍

SQL Join用于根据两个或多个表中的列之间的关系,从这些表中查询数据。Flink Stream SQL Join允许对两个流式table进行Join,并从中查询结果。支持类似于以下内容的查询:

SELECT o.proctime, o.productId, o.orderId, s.proctime AS shipTime 
FROM Orders AS o 
JOIN Shipments AS s 
ON o.orderId = s.orderId 
AND o.proctime BETWEEN s.proctime AND s.proctime + INTERVAL '1' HOUR;

目前,Stream SQL Join需在指定的窗口范围内进行。对窗口范围内的数据进行连接,需要至少一个相等连接谓词和一个绑定双方时间的条件。这个条件可以由两个适当的范围谓词(<<=>=>),一个BETWEEN谓词或者一个单一的相等谓词来定义。这个相等谓词主要是比较两个输入表的同类型时间属性(比如处理时间或者事件时间)。

以下是一个关于在收到订单后四小时内发货, 将所有订单及其相应的货件进行Join的示例:

SELECT *
FROM Orders o, Shipments s
WHERE o.id = s.orderId AND
o.ordertime BETWEEN s.shiptime - INTERVAL '4' HOUR AND s.shiptime
  1. Stream SQL Join仅支持Inner Join。
  2. ON子句应包括相等连接条件。
  3. 时间属性只支持处理时间和事件时间。
  4. 窗口条件只支持有界的时间范围,如o.proctime BETWEEN s.proctime - INTERVAL '1' HOUR AND s.proctime + INTERVAL '1' HOUR,不支持像o. proctime > s.proctime这样无界的范围,并应包括两个流的proctime属性,不支持o.proctime BETWEEN proctime () AND proctime () + 1