flink笔记14 动态表(Dynamic Tables)
Posted Aurora1217
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flink笔记14 动态表(Dynamic Tables)相关的知识,希望对你有一定的参考价值。
动态表
概念
动态表 是 Flink 的支持流数据的 Table API 和 SQL 的核心概念。
与表示批处理数据的静态表不同,动态表是随时间变化的。可以像查询静态批处理表一样查询它们。查询动态表将生成一个连续查询 。一个连续查询永远不会终止,结果会生成一个动态表。查询不断更新其(动态)结果表,以反映其(动态)输入表上的更改。本质上,动态表上的连续查询非常类似于定义物化视图的查询。
注意:连续查询的结果在语义上总是等价于以批处理模式在输入表 快照 上执行的相同查询的结果。
下图显示了流、动态表和连续查询之间的关系:
- 将流转换为动态表。
- 在动态表上计算一个连续查询,生成一个新的动态表。
- 生成的动态表被转换回流。
注意: 动态表首先是一个逻辑概念。在查询执行期间不一定(完全)物化动态表。
在流上定义表
为了使用关系查询处理流,必须将流转换成Table。从概念上讲,流的每条记录都被解释为对结果表的INSERT 操作
下图显示了单击事件流(左侧)如何转换为表(右侧)。当插入更多的单击流记录时,结果表将不断增长。
注意: 在流上定义的表在内部没有物化
连续查询
在动态表上计算一个连续查询,并生成一个新的动态表。与批处理查询不同,连续查询从不终止,并根据其输入表上的更新更新其结果表。在任何时候,连续查询的结果在语义上与以批处理模式在输入表快照上执行的相同查询的结果相同
[示例查询] 示例中的clicks表是在点击事件流上定义的
简单的 groupby count 聚合查询,基于user字段对clicks表进行分组(groupby),并统计(count)访问的 URL 的数量
下面的图显示了当 clicks 表被附加的行更新时,查询是如何被评估的。
在最开始的时候,左侧的clicks动态表是空的,当第一条数据插入到clicks表,开始计算结果表(一个新的动态表)。第一行数据[Mary,./home],在结果表里插入的结果就是[Mary,1];接着第二条数据[Bob,./cart]插入clicks表,查询会更新结果表,在结果里插入一条数据[Bob,1];然后第三条数据[Mary,./prod?id=1]到达,插入clicks表,查询更新结果表,将[Mary,1]更新(update)成[Mary,2];之后第四条数据到达插入clicks表,相应查询更新结果表。
更新和追加查询
[例1]
dataTable是流生成的一个动态表,resultTable是结果表,对dataTable进行了选择和筛选之后将表转换成了流并打印
[例2]
resultTable是结果表,对dataTable进行了分组(groupby),计数(count)之后将表转换成了流并打印
解析类似于连续查询的示例
例1查询时只追加到结果表,结果表的 changelog 流包含 insert 和 update操作
例2查询时会更新先前输出的结果,结果表的 changelog 流只包含insert操作
将仅追加(append-only)的表转换为流与将已更新的表转换为流是不同的。一个是toAppendStream,另一个是toRetractStream,使用方法见上面的两个例子
表到流的转换
动态表可以像普通数据库表一样通过insert、update 和delete来不断修改。它可能是一个只有一行、不断更新的表,也可能是一个 insert-only 的表,没有 update 和 delete 修改,或者介于两者之间的其他表
在将动态表转换为流或将其写入外部系统时,Flink的 Table API 和 SQL 支持三种方式来编码一个动态表的变化:
Append-only 流 : 仅通过 insert 操作修改的动态表可以通过输出插入的行转换为流
Retract 流
Upsert 流
注:在代码里将动态表转换为DataStream时,仅支持 append 流和 retract 流。而向外部系统输出动态表的TableSink接口,则可以有不同的实现,比如ES,就可以使用 upsert 模式。
以上是关于flink笔记14 动态表(Dynamic Tables)的主要内容,如果未能解决你的问题,请参考以下文章
Flink - Table API & SQL 流式概念 -- 动态表 (Dynamic Table)
FlinkFlink 源码阅读笔记(18)- Flink SQL 中的流和动态表
USDP使用笔记使用Flink1.14.3替换自带的老版Flink1.13