时间 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 函数之间的区别。官方文档解释的不是很清楚

https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/table/streaming/versioned_tables.html#versioned-table-views,


-- 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,包含插入以及更新和删除,我们可以将它变成一个重复数据删除查询,如您在上面发布的那样。