Flink 时序表和版本化表

919 阅读1分钟

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