0

0

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

星夢妙者

星夢妙者

发布时间:2025-09-28 09:39:01

|

1018人浏览过

|

来源于php中文网

原创

本文深入探讨了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)

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

Figstack
Figstack

一个基于 Web 的AI代码伴侣工具,可以帮助跨不同编程语言管理和解释代码。

下载

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

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

这个 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流处理中的特殊概念,主要包括表与流处理的区别、流处理查询的过程以及动态表的概念。这些内容主要从理论角度出发,没有实质性的代码。这些概念不需要非得记住,但只要了解即可。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

680

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

347

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

676

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

574

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

416

2024.04.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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