FlinkSQL

动态表

当流中有新数据到来,初始的表中会插入一行;而基于这个表定义的SQL查询,就应该在之前的基础上更新结果。这样得到的表就会不断地动态变化,被称为“动态表”(Dynamic Tables)。
动态表是Flink在Table API和SQL中的核心概念,它为流数据处理提供了表和SQL支持。我们所熟悉的表一般用来做批处理,面向的是固定的数据集,可以认为是“静态表”;而动态表则完全不同,它里面的数据会随时间变化。

持续查询

动态表可以像静态的批处理表一样进行查询操作。由于数据在不断变化,因此基于它定义的SQL查询也不可能执行一次就得到最终结果。这样一来,我们对动态表的查询也就永远不会停止,一直在随着新数据的到来而继续执行。这样的查询就被称作“持续查询”(Continuous Query)。对动态表定义的查询操作,都是持续查询;而持续查询的结果也会是一个动态表。
由于每次数据到来都会触发查询操作,因此可以认为一次查询面对的数据集,就是当前输入动态表中收到的所有数据。这相当于是对输入动态表做了一个“快照”(snapshot),当作有限数据集进行批处理;流式数据的到来会触发连续不断的快照查询,像动画一样连贯起来,就构成了“持续查询”。
在这里插入图片描述
持续查询的步骤如下:
(1)流(stream)被转换为动态表(dynamic table);
(2)对动态表进行持续查询(continuous query),生成新的动态表;
(3)生成的动态表被转换成流。
这样,只要API将流和动态表的转换封装起来,我们就可以直接在数据流上执行SQL查询,用处理表的方式来做流处理了。

将流转换成动态表

如果把流看作一张表,那么流中每个数据的到来,都应该看作是对表的一次插入(Insert)操作,会在表的末尾添加一行数据。因为流是连续不断的,而且之前的输出结果无法改变、只能在后面追加;所以我们其实是通过一个只有插入操作(insert-only)的更新日志(changelog)流,来构建一个表。
例如,当用户点击事件到来时,就对应着动态表中的一次插入(Insert)操作,每条数据就是表中的一行;随着插入更多的点击事件,得到的动态表将不断增长。
在这里插入图片描述

更新(Update)查询

我们在代码中定义了一个SQL查询。

Table urlCountTable = tableEnv.sqlQuery("SELECT user, COUNT(url) as cnt FROM EventTable GROUP BY user");

当原始动态表不停地插入新的数据时,查询得到的urlCountTable会持续地进行更改。由于count数量可能会叠加增长,因此这里的更改操作可以是简单的插入(Insert),也可以是对之前数据的更新(Update)。这种持续查询被称为更新查询(Update Query),更新查询得到的结果表如果想要转换成DataStream,必须调用toChangelogStream()方法。
在这里插入图片描述

将动态表转换为流

与关系型数据库中的表一样,动态表也可以通过插入(Insert)、更新(Update)和删除(Delete)操作,进行持续的更改。将动态表转换为流或将其写入外部系统时,就需要对这些更改操作进行编码,通过发送编码消息的方式告诉外部系统要执行的操作。在Flink中,Table API和SQL支持三种编码方式:

仅追加(Append-only)流

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

撤回(Retract)流

撤回流是包含两类消息的流,添加(add)消息和撤回(retract)消息。
具体的编码规则是:INSERT插入操作编码为add消息;DELETE删除操作编码为retract消息;而UPDATE更新操作则编码为被更改行的retract消息,和更新后行(新行)的add消息。这样,我们可以通过编码后的消息指明所有的增删改操作,一个动态表就可以转换为撤回流了。
在这里插入图片描述

更新插入(Upsert)流

更新插入流中只包含两种类型的消息:更新插入(upsert)消息和删除(delete)消息。
所谓的“upsert”其实是“update”和“insert”的合成词,所以对于更新插入流来说,INSERT插入操作和UPDATE更新操作,统一被编码为upsert消息;而DELETE删除操作则被编码为delete消息。
在这里插入图片描述

相关推荐

  1. <span style='color:red;'>FlinkSQL</span>

    FlinkSQL

    2023-12-22 18:32:02      32 阅读
  2. flinksql

    2023-12-22 18:32:02       14 阅读
  3. FlinkSQL Tips

    2023-12-22 18:32:02       14 阅读
  4. FlinkSQL窗口实例分析

    2023-12-22 18:32:02       35 阅读
  5. FlinkSQL 中lateral table

    2023-12-22 18:32:02       9 阅读
  6. FlinkSql-Temporal Joins-Lookup Join

    2023-12-22 18:32:02       47 阅读
  7. FlinkSQL的联结和函数

    2023-12-22 18:32:02       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-22 18:32:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-22 18:32:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-22 18:32:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-22 18:32:02       20 阅读

热门阅读

  1. Android Studio 显示Cause: connect timed out

    2023-12-22 18:32:02       38 阅读
  2. day6 力扣公共前缀--go实现---对字符串的一些思考

    2023-12-22 18:32:02       41 阅读
  3. hive中array相关函数总结

    2023-12-22 18:32:02       44 阅读
  4. 自定义ORM(mybatis)源码(一)-解析config.xml

    2023-12-22 18:32:02       36 阅读
  5. Semaphore的简单使用

    2023-12-22 18:32:02       35 阅读
  6. flutter学习-day16-自定义组件

    2023-12-22 18:32:02       45 阅读
  7. P8736 [蓝桥杯 2020 国 B] 游园安排

    2023-12-22 18:32:02       31 阅读
  8. GO设计模式——21、观察者模式(行为型)

    2023-12-22 18:32:02       33 阅读