Flink时序表和版本化表都是记录id在不同时间的数据的,在新的版本中,使用版本化表代替时序表。
时序表只能定义在append-only的流上,它不支持changelog的输入。并且时序表不能使用sql ddl创建。
时序表
创建时序表:
TemporalTableFunction rates = tEnv
.from("currency_rates").
.createTemporalTableFunction("update_time", "currency");
tEnv.registerFunction("rates", rates);
时序表join:
SELECT * FROM currency_rates;
update_time currency rate
============= ========= ====
09:00:00 Yen 102
09:00:00 Euro 114
09:00:00 USD 1
11:15:00 Euro 119
11:49:00 Pounds 108
SELECT * FROM orders;
order_time amount currency
========== ====== =========
10:15 2 Euro
10:30 1 USD
10:32 50 Yen
10:52 3 Euro
11:04 5 USD
join过程会根据不同的时间,从时序表中获取不同的rate进行计算。
SELECT
SUM(amount * rate) AS amount
FROM
orders,
LATERAL TABLE (rates(order_time))
WHERE
rates.currency = orders.currency
版本化表
版本化表也是与时间相关的数据,它可以根据append-only或者updates数据创建。
它必须用有一个primary key和time字段。
创建版本化表
Table source中创建
CREATE TABLE products (
product_id STRING,
product_name STRING,
price DECIMAL(32, 2),
update_time TIMESTAMP(3) METADATA FROM 'value.source.timestamp' VIRTUAL,
PRIMARY KEY (product_id) NOT ENFORCED,
WATERMARK FOR update_time AS update_time
) WITH (...);
查询创建
currency_rates数据:
(changelog kind) update_time currency rate
================ ============= ========= ====
+(INSERT) 09:00:00 Yen 102
+(INSERT) 09:00:00 Euro 114
+(INSERT) 09:00:00 USD 1
+(INSERT) 11:15:00 Euro 119
+(INSERT) 11:49:00 Pounds 108
CREATE VIEW versioned_rates AS
SELECT currency, rate, update_time
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY currency ORDER BY update_time DESC) AS rownum
FROM currency_rates)
WHERE rownum = 1;
PARTITION BY currency: 会作为结果版本化表的primary key