Flink流之动态表详解(二)
SQL
流处理
关系(或表)是有界(多)元组的集合。流是无限的元组序列。对批处理数据(例如,关系数据库中的表)执行的查询可以访问完整的输入数据。流式查询在启动时无法访问所有数据,必须“等待”数据流入。批处理查询在生成固定结果后终止。流式查询会根据收到的记录不断更新其结果,并且永远不会完成。
尽管存在这些差异,但使用关系查询和SQL处理流并非不可能。
高级关系数据库系统提供称为物化视图的功能。 物化视图定义为SQL查询,就像常规虚拟视图一样。
与虚拟视图相比,物化视图缓存查询的结果,使得在访问视图时不需要评估查询性能。 缓存的一个常见挑战是阻止缓存提供过时的结果。
实例化视图在修改其定义查询的基表时会过时。 Eager View Maintenance是一种在更新基表后立即更新实例化视图的技术。
如果我们考虑以下内容,视图维护和流上的SQL查询之间的联系就变得很明显:
数据库表是INSERT,UPDATE和DELETE DML语句流的结果,通常称为changelog流。
物化视图定义为SQL查询。 为了更新视图,查询会持续处理视图基本关系的更新日志流。
物化视图是流式SQL查询的结果。
考虑到这些要点,我们将继续介绍动态表的以下概念。
动态表和连续查询
动态表是Flink的Table API和SQL支持流数据的核心概念。 与表示批处理数据的静态表相比,动态表随时间而变化。 可以像静态批处理表一样查询它们。 查询动态表会产生连续查询。 连续查询永远不会终止并生成动态表作为结果。 查询不断更新其(动态)结果表以反映其(动态)输入表的更改。 实质上,动态表上的连续查询与定义物化视图的查询非常相似。
值得注意的是,连续查询的结果始终在语义上等同于在输入表的快照上以批处理模式执行的相同查询的结果。这个比较绕,简单来说就是连续查询也是由状态的,一次查询跟批处理查询相比,执行方式和结果是相同的。
下图显示了流,动态表和连续查询的关系:
流转换为动态表。
在动态表上连续查询,生成新的动态表。
生成的动态表将转换回流。
注意:动态表首先是一个逻辑概念。 在查询执行期间,动态表不一定(完全)物化。
在下文中,我们将使用具有以下模式的单击事件流来解释动态表和连续查询的概念:
[Plain Text] 纯文本查看 复制代码
1
2
3
4
5
[
user: VARCHAR, // the name of the user
cTime: TIMESTAMP, // the time when the URL was accessed
url: VARCHAR // the URL that was accessed by the user
]
在流上定义表
为了使用关系查询处理流,必须将其转换为表。 从概念上讲,流的每个记录都被解释为对结果表的INSERT修改。 本质上,我们从INSERT更改日志流【changelog】构建表。
下图显示了click事件流(左侧)如何转换为表(右侧)。 随着更多点击流记录的插入,生成的表不断增长。
注意:在流上定义的表在内部未实现。
(1)连续查询
在动态表上计算连续查询,并生成新的动态表作为结果。
与批处理查询相反,连续查询永远不会,根据其输入表上的更新,终止并更新其结果表。
在任何时间点,连续查询的结果,在语义上等同于在输入表的快照上,以批处理模式执行的相同查询的结果。也就是说在某个时间点或则任意时间点上连续查询跟批查询结果是等同的。
在下文中,我们在点击事件流上定义的点击表上显示两个示例查询。
第一个查询是一个简单的GROUP-BY COUNT聚合查询。 它将点击表按user字段分组,并计算访问过的URL的数量。 下图显示了在使用其它行更新clicks表时,如何查询。