博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手机购书页面。 |
从各方收集的资料以及官方文档对 Temporal Joins 和 Temporal Table Function 两部分的描述可以确定的是:
Flink 是先有的 Temporal Table Function,利用它实现了类版本表的功能,注意,是类版本表,不是现在文档中定义的标准版本表概念,后来,Flink 才引入了 Temporal Table (版本表 / 普通表)概念(本文称之为“Temporal Table DDL”方式),同时实现了 SQL 2011 标准,引入了 FOR SYSTEM_TIME AS OF 关键字实现了基于版本表的 Temporal Join。
在 Temporal Join 中,有两种模式,分别是:基于事件时间 和 基于处理时间,最初,Temporal Table DDL 和 Temporal Table Function 都支持这两种模式,但后来,由于 FLINK-19830 问题,使用 Temporal Table DDL 定义的时态表不再支持基于处理时间的 Temporal Join,这就是为什么我们今天搜索一些 Temporal Join 的技术文章时,会发现很多 Temporal Table DDL + 基于处理时间的 Temporal Join 示例,但在现在的官方文档中是没有对等示例的。
本质上,Temporal Table DDL 和 Temporal Table Function 是一样的,它们定义出的都是 “版本表”,再次强调一遍:它们定义出的都是 “版本表”,对 Temporal Table DDL 来说,这是自然的,大家更容易误解的其实是 Temporal Table Function,认为 Temporal Table Function 可以是“版本表” 也可以是 “普通表”,这是受到了 “只能通过 Temporal Table Function 才可以实现基于处理时间的 Temporal Join”结论的影响而产生的错误解读(至少我本人曾这样错误的认为过)。只要我们认真看一下声明一个 Temporal Table Function 的方法就知道了:Table.createTemporalTableFunction(“时间属性列”, “主键列”),你会看到,定义一个 Temporal Table Function 必须同时指定主键和时间戳两个字段,这个 Temporal Table DDL 是一样的!
Temporal Table DDL 和 Temporal Table Function 虽然本质上是等价的,但它们之间存在两点差异:
-
SQL 中可以定义 Temporal Table DDL,但不能定义 Temporal Table Function,后者只能在代码中使用 Table API 注册
-
Temporal Table DDL 和 Temporal Table Function 都可以实现 Temporal Join,它们都支持基于事件时间的 Temporal Join,但只有 Temporal Table Function 可以 Temporal Join 任何表/视图的最新版本(即"基于处理时间的 Temporal Join"),而 Temporal Table DDL 最初引入时可以的,后因 FLINK-19830 问题又被禁止
以下是对 Temporal Table DDL 和 Temporal Table Function 的对比总结:
方式 | 基于事件时间的 Temporal Join | 基于处理事件的 Temporal Join | 可完全在 SQL 中定义 |
---|---|---|---|
Temporal Table DDL | 支持 | 不支持 (曾经支持,因为 Issue FLINK-19830 而在新版本中禁止) | 可以 |
Temporal Table Function | 支持 | 支持(但同样有语义问题,出于兼容考虑才支持) | 不可以(目前只能在代码中函数注册函数) |