时间 table 函数和版本化 table 有什么区别
What's the difference between temporal table function and versioned table
在Flink 1.12中,Flink引入了一个新的概念,叫做versioned table
,它和temporal table function
非常相似,但是我有点困惑在这两个概念之间。
temporal table function
只支持append-onlytable(如有错误请指正),如:
(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
我们能否将上面的仅附加 table 也称为版本化 table,从官方文档看来答案是 NO? 。但我认为它可以称为版本化 table 因为它保留了更改历史记录,并且我可以获得给定时间点 的 table 的版本(快照)(这对我来说是令人困惑的部分)
在下面的 link 中,它通过定义一个版本化的-table-视图,将仅附加的 table 转换为版本化的 table转换,看起来仅附加 table 没有版本化 table?
您能否解释一下什么是版本 table 以及版本 table 和临时 table 函数之间的区别。官方文档解释的不是很清楚
-- Define a versioned view
CREATE VIEW versioned_rates AS
SELECT currency, rate, update_time -- (1) `update_time` keeps the event time
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY currency -- (2) the inferred unique key `currency` can be a primary key
ORDER BY update_time DESC) AS rownum
FROM currency_rates)
WHERE rownum = 1;
-- the view `versioned_rates` will produce a changelog as the following.
(changelog kind) update_time currency rate
================ ============= ========= ====
+(INSERT) 09:00:00 Yen 102
+(INSERT) 09:00:00 Euro 114
+(INSERT) 09:00:00 USD 1
+(UPDATE_AFTER) 10:45:00 Euro 116
+(UPDATE_AFTER) 11:15:00 Euro 119
+(INSERT) 11:49:00 Pounds 108
您可以将 Temporal Table 函数视为某种版本化 table 的先前版本(legacy features part of Flink 中也有说明)。
在您的第一个示例中,您仅创建了一个附加项 table,它将包含相同货币(即欧元)的多个键,这使得它没有资格成为主键。
您能否将仅追加 table 称为版本化 table?文档中 Versioned Tables 的定义说:
Flink SQL can define versioned tables over any dynamic table with a
PRIMARY KEY constraint and time attribute.
这意味着仅附加 table 不能用作版本化 table,因为正如我们所说,它不能保持主键约束。
但是,由于您示例中的附加 table 确实包含相关信息以成为版本化的 table,包含插入以及更新和删除,我们可以将它变成一个重复数据删除查询,如您在上面发布的那样。
在Flink 1.12中,Flink引入了一个新的概念,叫做versioned table
,它和temporal table function
非常相似,但是我有点困惑在这两个概念之间。
temporal table function
只支持append-onlytable(如有错误请指正),如:
(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
我们能否将上面的仅附加 table 也称为版本化 table,从官方文档看来答案是 NO? 。但我认为它可以称为版本化 table 因为它保留了更改历史记录,并且我可以获得给定时间点 的 table 的版本(快照)(这对我来说是令人困惑的部分)
在下面的 link 中,它通过定义一个版本化的-table-视图,将仅附加的 table 转换为版本化的 table转换,看起来仅附加 table 没有版本化 table?
您能否解释一下什么是版本 table 以及版本 table 和临时 table 函数之间的区别。官方文档解释的不是很清楚
-- Define a versioned view
CREATE VIEW versioned_rates AS
SELECT currency, rate, update_time -- (1) `update_time` keeps the event time
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY currency -- (2) the inferred unique key `currency` can be a primary key
ORDER BY update_time DESC) AS rownum
FROM currency_rates)
WHERE rownum = 1;
-- the view `versioned_rates` will produce a changelog as the following.
(changelog kind) update_time currency rate
================ ============= ========= ====
+(INSERT) 09:00:00 Yen 102
+(INSERT) 09:00:00 Euro 114
+(INSERT) 09:00:00 USD 1
+(UPDATE_AFTER) 10:45:00 Euro 116
+(UPDATE_AFTER) 11:15:00 Euro 119
+(INSERT) 11:49:00 Pounds 108
您可以将 Temporal Table 函数视为某种版本化 table 的先前版本(legacy features part of Flink 中也有说明)。
在您的第一个示例中,您仅创建了一个附加项 table,它将包含相同货币(即欧元)的多个键,这使得它没有资格成为主键。
您能否将仅追加 table 称为版本化 table?文档中 Versioned Tables 的定义说:
Flink SQL can define versioned tables over any dynamic table with a PRIMARY KEY constraint and time attribute.
这意味着仅附加 table 不能用作版本化 table,因为正如我们所说,它不能保持主键约束。
但是,由于您示例中的附加 table 确实包含相关信息以成为版本化的 table,包含插入以及更新和删除,我们可以将它变成一个重复数据删除查询,如您在上面发布的那样。