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)

Flink- 将表转换成DataStream | 查看执行计划 | 流处理和关系代数的区别 | 动态表 | 流式持续查询的过程 | 将流转换成动态表 | 持续查询 | 将动态表转换成 DS_第1张图片
没有经过groupby之类聚合操作,可以直接用 toAppendStream 来转换;而如果经过了聚合,有更新操作,一般就必须用 toRetractDstream。

查看执行计划

Blink版本是批流统一的,所以所有的Query,只会被解释成DataStream程序;另外在批处理环境TableEnvironment下,Blink版本要到tableEnv.execute()执行调用才开始解释。
Flink- 将表转换成DataStream | 查看执行计划 | 流处理和关系代数的区别 | 动态表 | 流式持续查询的过程 | 将流转换成动态表 | 持续查询 | 将动态表转换成 DS_第2张图片

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

// 测试
println(explaination)

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

流处理和关系代数的区别

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

可以看到,其实关系代数(主要就是指关系型数据库中的表)和SQL,主要就是针对批处理的,这和流处理有天生的隔阂。
Flink- 将表转换成DataStream | 查看执行计划 | 流处理和关系代数的区别 | 动态表 | 流式持续查询的过程 | 将流转换成动态表 | 持续查询 | 将动态表转换成 DS_第4张图片

动态表(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. 生成的动态表被转换回流。

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

将流转换成动态表

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

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

持续查询(Continuous Query)

  1. 持续查询,会在动态表上做计算处理,并作为结果生成新的动态表。与批处理查询不同,连续查询从不终止,并根据输入表上的更新更新其结果表。
  2. 在任何时间点,连续查询的结果在语义上,等同于在输入表的快照上,以批处理模式执行的同一查询的结果。
  3. 下图为一个点击事件流的持续查询,是一个分组聚合做count统计的查询。
    它将用户字段上的clicks表分组,并统计访问的url数。图中显示了随着时间的推移,当clicks表被其他行更新时如何计算查询。Flink- 将表转换成DataStream | 查看执行计划 | 流处理和关系代数的区别 | 动态表 | 流式持续查询的过程 | 将流转换成动态表 | 持续查询 | 将动态表转换成 DS_第7张图片

将动态表转换成 DataStream

  1. 与常规的数据库表一样,动态表可以通过插入(Insert)、更新(Update)和删除(Delete)更改,进行持续的修改
  2. 将动态表转换为流或将其写入外部系统时,需要对这些更改进行编码
    Flink- 将表转换成DataStream | 查看执行计划 | 流处理和关系代数的区别 | 动态表 | 流式持续查询的过程 | 将流转换成动态表 | 持续查询 | 将动态表转换成 DS_第8张图片
  3. 追加流: 就是这个流中发出的数据,就是动态表中新增的每一行。
  4. 撤回流: 动态表通过将INSERT 编码为add消息、DELETE 编码为retract消息、UPDATE编码为被更改行(前一行)的retract消息和更新后行(新行)的add消息,转换为retract流。
  5. 更新流: 通过将INSERT和UPDATE更改编码为upsert消息,将DELETE更改编码为DELETE消息,就可以将具有唯一键(Unique Key)的动态表转换为流。
    Flink- 将表转换成DataStream | 查看执行计划 | 流处理和关系代数的区别 | 动态表 | 流式持续查询的过程 | 将流转换成动态表 | 持续查询 | 将动态表转换成 DS_第9张图片

你可能感兴趣的:(Flink)