Flink- 将表转换成DataStream | 查看执行计划 | 流处理和关系代数的区别 | 动态表 | 流式持续查询的过程 | 将流转换成动态表 | 持续查询 | 将动态表转换成 DS

GitHub

https://github.com/SmallScorpion/flink-tutorial.git

将表转换成DataStream

  1. 表可以转换为 DataStream 或 DataSet ,这样自定义流处理或批处理程序就可以继续在 Table API 或 SQL 查询的结果上运行了
  2. 将表转换为 DataStream 或 DataSet 时,需要指定生成的数据类型,即要将表的每一行转换成的数据类型
  3. 表作为流式查询的结果,是动态更新的
  4. 转换有两种转换模式:追加(Appende)模式和撤回(Retract)模式
  5. 追加模式:用于表只会被插入(Insert)操作更改的场景。
  6. 撤回模式:用于任何场景。有些类似于更新模式中Retract模式,它只有Insert和Delete两类操作。(得到的数据会增加一个Boolean类型的标识位(返回的第一个字段),用它来表示到底是新增的数据(Insert),还是被删除的数据(老数据, Delete)。)
// 追加模式
val resultStream: DataStream[Row] = tableEnv.toAppendStream[Row](resultTable)
// 撤回模式
val aggResultStream: DataStream[(Boolean, (String, Long))] = tableEnv
       .toRetractStream[(String, Long)](aggResultTable)

在这里插入图片描述
没有经过groupby之类聚合操作,可以直接用 toAppendStream 来转换;而如果经过了聚合,有更新操作,一般就必须用 toRetractDstream。

查看执行计划

Blink版本是批流统一的,所以所有的Query,只会被解释成DataStream程序;另外在批处理环境TableEnvironment下,Blink版本要到tableEnv.execute()执行调用才开始解释。
在这里插入图片描述

// 查看执行计划
val explaination: String = tableEnv.explain( resultTable )

// 测试
println(explaination)

在这里插入图片描述

流处理和关系代数的区别

Table API和SQL,本质上还是基于关系型表的操作方式;而关系型表、关系代数,以及SQL本身,一般是有界的,更适合批处理的场景。这就导致在进行流处理的过程中,理解会稍微复杂一些,需要引入一些特殊概念。

可以看到,其实关系代数(主要就是指关系型数据库中的表)和SQL,主要就是针对批处理的,这和流处理有天生的隔阂。
在这里插入图片描述

动态表(Dynamic Tables)

  1. 因为流处理面对的数据,是连续不断的,这和我们熟悉的关系型数据库中保存的“表”完全不同。所以,如果我们把流数据转换成Table,然后执行类似于table的select操作,结果就不是一成不变的,而是随着新数据的到来,会不停更新。
  2. 我们可以随着新数据的到来,不停地在之前的基础上更新结果。这样得到的表,在Flink Table API概念里,就叫做“动态表”(Dynamic Tables)。
  3. 动态表是 Flink 对流数据的 Table API 和 SQL 支持的核心概念
  4. 与表示批处理数据的静态表不同,动态表是随时间变化的
  5. 动态表可以像静态的批处理表一样进行查询,查询一个动态表会产生持续查询(Continuous Query)
  6. 连续查询永远不会终止,并会生成另一个动态表
  7. 查询(Query)会不断更新其动态结果表,以反映其动态输入表上的更改。

流式持续查询的过程

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

在这里插入图片描述

将流转换成动态表

  1. 为了处理带有关系查询的流,必须先将其转换为表
  2. 从概念上讲,流的每个数据记录,都被解释为对结果表的插入(Insert)修改操作
  3. 本质上,我们其实是从一个、只有插入操作的changelog(更新日志)流,来构建一个表。
  4. 来一条数据插入一条数据

在这里插入图片描述

持续查询(Continuous Query)

  1. 持续查询,会在动态表上做计算处理,并作为结果生成新的动态表。与批处理查询不同,连续查询从不终止,并根据输入表上的更新更新其结果表。
  2. 在任何时间点,连续查询的结果在语义上,等同于在输入表的快照上,以批处理模式执行的同一查询的结果。
  3. 下图为一个点击事件流的持续查询,是一个分组聚合做count统计的查询。
    它将用户字段上的clicks表分组,并统计访问的url数。图中显示了随着时间的推移,当clicks表被其他行更新时如何计算查询。在这里插入图片描述

将动态表转换成 DataStream

  1. 与常规的数据库表一样,动态表可以通过插入(Insert)、更新(Update)和删除(Delete)更改,进行持续的修改
  2. 将动态表转换为流或将其写入外部系统时,需要对这些更改进行编码
    在这里插入图片描述
  3. 追加流: 就是这个流中发出的数据,就是动态表中新增的每一行。
  4. 撤回流: 动态表通过将INSERT 编码为add消息、DELETE 编码为retract消息、UPDATE编码为被更改行(前一行)的retract消息和更新后行(新行)的add消息,转换为retract流。
  5. 更新流: 通过将INSERT和UPDATE更改编码为upsert消息,将DELETE更改编码为DELETE消息,就可以将具有唯一键(Unique Key)的动态表转换为流。
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章