一篇文章带你深入了解Flink SQL流处理中的特殊概念

星夢妙者
发布: 2025-09-28 09:39:01
原创
1018人浏览过

本文深入探讨了flink sql流处理中的特殊概念,主要包括表与流处理的区别、动态表的概念以及流式持续查询的过程。以下是详细介绍。

一篇文章带你深入了解Flink SQL流处理中的特殊概念

一、流处理和关系代数(表,及 SQL)的区别

一篇文章带你深入了解Flink SQL流处理中的特殊概念一篇文章带你深入了解Flink SQL流处理中的特殊概念

可以看出,关系代数(主要指关系型数据库中的表)和 SQL 主要针对批处理,这与流处理存在天然的差异。

二、动态表(Dynamic Tables)

一篇文章带你深入了解Flink SQL流处理中的特殊概念

由于流处理面对的是连续不断的数据,这与我们熟悉的关系型数据库中保存的表完全不同。因此,如果我们将流数据转换为表,然后执行类似于表的select操作,结果就不是一成不变的,而是随着新数据的到来,不断更新。

随着新数据的到来,我们可以不断地在之前的基础上更新结果。这样得到的表,在Flink Table API概念里,就称为动态表(Dynamic Tables)。

动态表是Flink对流数据的Table API和SQL支持的核心概念。与表示批处理数据的静态表不同,动态表随时间变化。动态表可以像静态的批处理表一样进行查询,查询一个动态表会产生持续查询(Continuous Query)。持续查询永远不会终止,并会生成另一个动态表。查询会不断更新其动态结果表,以反映其动态输入表上的更改。

三、流式持续查询的过程

一篇文章带你深入了解Flink SQL流处理中的特殊概念

动态表和持续查询的关系如下图所示:

一篇文章带你深入了解Flink SQL流处理中的特殊概念

流式持续查询的过程为:

  1. 流被转换为动态表。
  2. 对动态表计算连续查询,生成新的动态表。
  3. 生成的动态表被转换回流

3.1 将流转换成表(Table)

为了处理带有关系查询的流,必须先将其转换为表。

概念上讲,流的每个数据记录,都被解释为对结果表的插入(Insert)修改。因为流式持续不断的,而且之前的输出结果无法改变。本质上,我们其实是从一个只有插入操作的changelog(更新日志)流,来构建一个表。

为了更好地说明动态表和持续查询的概念,我们来举一个具体的例子。

比如,我们现在的输入数据,就是用户在网站上的访问行为,数据类型(Schema)如下:

[user: VARCHAR, // 用户名
cTime: TIMESTAMP, // 访问某个 URL 的时间戳
url: VARCHAR // 用户访问的 URL]
登录后复制

下图显示了如何将访问 URL 事件流,或者叫点击事件流(左侧)转换为表(右侧)。

一篇文章带你深入了解Flink SQL流处理中的特殊概念

随着插入更多的访问事件流记录,生成的表将不断增长。

3.2 持续查询(Continuous Query)

持续查询,会在动态表上做计算处理,并作为结果生成新的动态表。与批处理查询不同,连续查询从不终止,并根据输入表上的更新更新其结果表。

Hugging Face
Hugging Face

Hugging Face AI开源社区

Hugging Face 270
查看详情 Hugging Face

在任何时间点,连续查询的结果在语义上,等同于在输入表的快照上,以批处理模式执行的同一查询的结果。

在下面的示例中,我们展示了对点击事件流中的一个持续查询。

这个 Query 很简单,是一个分组聚合做 count 统计的查询。它将用户字段上的 clicks 表分组,并统计访问的 url 数。图中显示了随着时间的推移,当 clicks 表被其他行更新时如何计算查询。

一篇文章带你深入了解Flink SQL流处理中的特殊概念

3.3 将动态表转换成流

与常规的数据库表一样,动态表可以通过插入(Insert)、更新(Update)和删除(Delete)更改,进行持续的修改。将动态表转换为流或将其写入外部系统时,需要对这些更改进行编码。Flink 的Table API 和 SQL 支持三种方式对动态表的更改进行编码:

① 仅追加(Append-only)流

仅通过插入(Insert)更改,来修改的动态表,可以直接转换为仅追加流。这个流中发出的数据,就是动态表中新增的每一行。

② 撤回(Retract)流

Retract 流是包含两类消息的流,添加(Add)消息和撤回(Retract)消息。

动态表通过将 INSERT 编码为 add 消息、DELETE 编码为 retract 消息、UPDATE 编码为被更改行(前一行)的 retract 消息和更新后行(新行)的 add 消息,转换为 retract 流。

下图显示了将动态表转换为 Retract 流的过程。

一篇文章带你深入了解Flink SQL流处理中的特殊概念

③ Upsert(更新插入)流

Upsert 流包含两种类型的消息:Upsert 消息和 delete 消息。转换为 upsert 流的动态表,需要有唯一的键(key)。

通过将 INSERT 和 UPDATE 更改编码为 upsert 消息,将 DELETE 更改编码为 DELETE 消息,就可以将具有唯一键(Unique Key)的动态表转换为流。

下图显示了将动态表转换为 upsert 流的过程。

一篇文章带你深入了解Flink SQL流处理中的特殊概念

这些概念我们之前都已提到过。需要注意的是,在代码里将动态表转换为 DataStream时,仅支持 Append 和 Retract 流。而向外部系统输出动态表的 TableSink 接口,则可以有不同的实现。

总结

一篇文章带你深入了解Flink SQL流处理中的特殊概念

本文详细讲解了Flink SQL流处理中的特殊概念,主要包括表与流处理的区别、流处理查询的过程以及动态表的概念。这些内容主要从理论角度出发,没有实质性的代码。这些概念不需要非得记住,但只要了解即可。

以上就是一篇文章带你深入了解Flink SQL流处理中的特殊概念的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号