联接(Joins)是批处理数据处理中连接两个关系行的常见且易于理解的操作。然而,动态表上连接的语义不太明显,甚至不容易混淆。因此,有两种方法可以使用表API或SQL实际执行连接。
一、Regular Joins(常规联接)
常规联接是最通用的联接类型,其中对联接输入的任何一侧的任何新记录或更改都是可见的,并且会影响整个联接结果。例如,如果左侧有一个新记录,则它将与右侧所有以前和将来的记录联接
SELECT * FROM Orders
INNER JOIN Product
ON Orders.productId =Product.id
这些语义允许任何类型的更新(插入、更新、删除)输入表。
然而,这个操作有一个重要的含义:它要求连接输入的两边永远保持在Flink的状态。因此,如果一个或两个输入表都在持续增长,那么资源使用量也将无限增长。
二、Time-windowed Joins(时间窗口连接)
时间窗口连接由连接谓词定义,该谓词检查输入记录的时间属性是否在特定的时间限制(即时间窗口)内。
SELECT *
FROM
Orders o,
Shipments s
WHERE o.id = s.orderId
AND o.ordertime BETWEEN s.shiptime - INTERVAL ‘4’ HOUR AND s.shiptime
与常规联接操作相比,这种联接只支持具有时间属性的append only表。由于时间属性是准单调递增的,Flink可以在不影响结果正确性的情况下从其状态中删除旧值。
三、Join with a Temporal Table Function(使用临时表函数联接)
带有时态表函数的连接将只追加表(左输入/探测侧)与时态表(右输入/构建侧)连接起来,即,随时间变化并跟踪其变化的表。有关时态表的更多信息,请查看相应的页面。
下面的示例显示了一个只追加的表顺序,该表顺序应与不断变化的货币汇率表RatesHistory连接在一起。
Orders是一个只追加的表,表示对给定金额和给定货币的付款。例如,在10:15有一个2欧元的订单。
SELECT * FROM Orders;
rowtime amount currency
======= ====== =========
10:15 2 Euro
10:30 1 US Dollar
10:32 50 Yen
10:52 3 Euro
11:04 5 US Dollar
RatesHistory代表一个不断变化的货币汇率附加表(日元汇率为1)。例如,欧元对日元的汇率从09:00到10:45为114。从10:45到11:15是116。

本文探讨了流数据处理中的联接技术,包括常规联接、时间窗口连接、使用临时表函数联接和使用临时表联接。深入解析了各种联接方式的特点和适用场景,如时态表连接在流充实中的应用。
最低0.47元/天 解锁文章
182

被折叠的 条评论
为什么被折叠?



