Flink-Table Streaming 持续查询中的关联(六)

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

联接(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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

springk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值