这篇文章主要介绍“flink动态表的思路”,在日常操作中,相信很多人在flink动态表的思路问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”flink动态表的思路”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
传统的数据库SQL和实时SQL处理的差别还是很大的,这里简单列出一些区别:
传统数据库SQL处理
实时SQL处理
传统数据库的表数据是有界限的
实时数据无界限的
在批处理数据的查询是需要获取全量数据
无法获取全量数据,必须等待新的数据输入
处理结束后就终止了
利用输入的数据不断的更新它的结果表,绝对不会停止
尽管存在这些差异,但使用关系查询和SQL处理流并非不可能。高级关系数据库系统提供称为物化视图的功能。物化视图定义为SQL查询,就像常规虚拟视图一样。与虚拟视图相比,物化视图缓存查询的结果,使得在访问视图时不需要执行查询。缓存的一个常见挑战是避免缓存提供过时的结果。物化视图在修改其定义查询的基表时会过时。Eager View Maintenance是一种在更新基表后立即更新实例化视图的技术。
如果我们考虑以下内容,Eager View Maintenance和流上的SQL查询之间的联系就变得很明显:
数据库表是INSERT,UPDATE和DELETEDML语句流的结果,通常被称为更新日志流。
物化视图定义为SQL查询。为了更新视图,查询需要持续处理视图源表的更改日志流。
物化视图是流式SQL查询的结果。
有了上面的基础,下面可以介绍一下动态表的概念了。
动态表和持续不断查询
动态表flink table api和SQL处理流数据的核心概念。与静态表相比,动态表随时间而变化,但可以像静态表一样查询动态表,只不过查询动态表需要产生连续查询。连续查询永远不会终止,会生成动态表作为结果表。查询不断更新其(动态)结果表以反映其(动态)输入表的更改。最终,动态表上的连续查询与定义物化视图的查询非常相似。
值得注意的是,连续查询的结果始终在语义上等同于在输入表的快照上执行批处理的到的相同查询结果。
下图显示了流,动态表和连续查询的关系:
数据流被转化为动态表
在产生的动态表上执行连续不断的查询,产生一个动态结果表。
结果动态表再次被转化为数据流。
注意:动态表最重要的是逻辑概念。在查询执行期间,动态表不一定(完全)物化。
在下文中,会以schema如下的点击事件流来解释动态表和连续不断的查询。
[ 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]节>
<强>转流化成表强>
当然,想要用经典的sql去分析流数据,肯定要先将其转化为表。从概念上讲,流的每个新增记录都被解释为对结果表的插入操作。最终,可以理解为是在从一个纯插入更新日志流上构建一个表。
下图显示了点击事件流(左侧)如何转换为表(右)侧。随着更多点击流记录的插入,生成的表不断增长。
注意:转流化的表内部并没有被物化。
<强>连续查询强>
在动态表上执行连续查询,并生成新的动态表作为结果表。与批处理查询不同,连续查询绝不会终止,而且会根据输入表的更新来更新它的结果表。在任何时间点,连续查询的结果在语义上等同于在输入表的快照上以批处理模式得到的查询的结果。
在下文中,我们将在用点击事件流定义的点击表上展示两个示例查询。
第一个查询是一个简单的group by数聚合查询。主要是对点击表按照用户分组,然后统计得url到访问次数。下图展示了点击表在数据增加期间查询是如何执行的。