目录

相关概念

Dynamic Tables & Continuous Queries

​​​​​​​Table to Stream Conversion


​​​​​​​

​​​​​​​相关概念

https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/table/streaming/dynamic_tables.html

​​​​​​​Dynamic Tables & Continuous Queries

在Flink中,它把针对无界流的表称之为Dynamic Table(动态表)。它是Flink Table API和SQL的核心概念。顾名思义,它表示了Table是不断变化的。

我们可以这样来理解,当我们用Flink的API,建立一个表,其实把它理解为建立一个逻辑结构,这个逻辑结构需要映射到数据上去。Flink source源源不断的流入数据,就好比每次都往表上新增一条数据。表中有了数据,我们就可以使用SQL去查询了。要注意一下,流处理中的数据是只有新增的,所以看起来数据会源源不断地添加到表中。

动态表也是一种表,既然是表,就应该能够被查询。我们来回想一下原先我们查询表的场景。

打开编译工具,编写一条SQL语句

  • 将SQL语句放入到mysql的终端执行
  • 查看结果
  • 再编写一条SQL语句
  • 再放入到终端执行
  • 再查看结果

…..如此反复

而针对动态表,Flink的source端肯定是源源不断地会有数据流入,然后我们基于这个数据流建立了一张表,再编写SQL语句查询数据,进行处理。这个SQL语句一定是不断地执行的。而不是只执行一次。注意:针对流处理的SQL绝对不会像批式处理一样,执行一次拿到结果就完了。而是会不停地执行,不断地查询获取结果处理。所以,官方给这种查询方式取了一个名字,叫Continuous Query,中文翻译过来叫连续查询。而且每一次查询出来的数据也是不断变化的。

这是一个非常简单的示意图。该示意图描述了:我们通过建立动态表和连续查询来实现在无界流中的SQL操作。大家也可以看到,在Continuous上面有一个State,表示查询出来的结果会存储在State中,再下来Flink最终还是使用流来进行处理。

所以,我们可以理解为Flink的Table API和SQL,是一个逻辑模型,通过该逻辑模型可以让我们的数据处理变得更加简单。

​​​​​​​Table to Stream Conversion

  • 表中的Update和Delete

我们前面提到的表示不断地Append,表的数据是一直累加的,因为表示对接Source的,Source是不会有update的。但如果我们编写了一个SQL。这个SQL看起来是这样的:


SELECT user, sum(money) FROM order GROUP BY user;

第一条数据,张三,2000,执行这条SQL语句的结果是,张三,2000当执行一条SQL语句之后,这条语句的结果还是一个表,因为在Flink中执行的SQL是Continuous Query,这个表的数据是不断变化的。新创建的表存在Update的情况。仔细看下下面的示例,例如:

第二条数据,李四,1500,继续执行这条SQL语句,结果是,张三,2000 | 李四,1500

第三条数据,张三,300,继续执行这条SQL语句,结果是,张三,2300 | 李四,1500

….

大家发现了吗,现在数据结果是有Update的。张三一开始是2000,但后面变成了2300。

那还有删除的情况吗?有的。看一下下面这条SQL语句:

SELECT t1.`user`, SUM(t1.`money`) FROM t_order t1WHERENOT EXISTS (SELECT T2.`user`AS TOTAL_MONEY FROM t_order t2 WHERE T2.`user` = T1.`user` GROUP BY t2.`user` HAVING SUM(T2.`money`) > 3000)GROUP BY t1.`user`GROUP BY t1.`user`

第一条数据,张三,2000,执行这条SQL语句的结果是,张三,2000

第二条数据,李四,1500,继续执行这条SQL语句,结果是,张三,2000 | 李四,1500

第三条数据,张三,300,继续执行这条SQL语句,结果是,张三,2300 | 李四,1500

第四条数据,张三,800,继续执行这条SQL语句,结果是,李四,1500

惊不惊喜?意不意外?

因为张三的消费的金额已经超过了3000,所以SQL执行完后,张三是被处理掉了。从数据的角度来看,它不就是被删除了吗?

通过上面的两个示例,给大家演示了,在Flink SQL中,对接Source的表都是Append-only的,不断地增加。执行一些SQL生成的表,这个表可能是要UPDATE的、也可能是要INSERT的。

  • 对表的编码操作

我们前面说到过,表是一种逻辑结构。而Flink中的核心还是Stream。所以,Table最终还是会以Stream方式来继续处理。如果是以Stream方式处理,最终Stream中的数据有可能会写入到其他的外部系统中,例如:将Stream中的数据写入到MySQL中。

我们前面也看到了,表是有可能会UPDATE和DELETE的。那么如果是输出到MySQL中,就要执行UPDATE和DELETE语句了。而DataStream我们在学习Flink的时候就学习过了,DataStream是不能更新、删除事件的。

如果对表的操作是INSERT,这很好办,直接转换输出就好,因为DataStream数据也是不断递增的。但如果一个TABLE中的数据被UPDATE了、或者被DELETE了,如果用流来表达呢?因为流不可变的特征,我们肯定要对这种能够进行UPDATE/DELETE的TABLE做特殊操作。

我们可以针对每一种操作,INSERT/UPDATE/DELETE都用一个或多个经过编码的事件来表示。

例如:针对UPDATE,我们用两个操作来表达,[DELETE] 数据+  [INSERT]数据。也就是先把之前的数据删除,然后再插入一条新的数据。针对DELETE,我们也可以对流中的数据进行编码,[DELETE]数据。

总体来说,我们通过对流数据进行编码,也可以告诉DataStream的下游,[DELETE]表示发出MySQL的DELETE操作,将数据删除。用 [INSERT]表示插入新的数据。

  • 将表转换为三种不同编码方式的流

Flink中的Table API或者SQL支持三种不同的编码方式。分别是:

Append-only流

Retract流

Upsert流

分别来解释下这三种流。

  • Append-only流

跟INSERT操作对应。这种编码类型的流针对的是只会不断新增的Dynamic Table。这种方式好处理,不需要进行特殊处理,源源不断地往流中发送事件即可。

  • Retract流

这种流就和Append-only不太一样。上面的只能处理INSERT,如果表会发生DELETE或者UPDATE,Append-only编码方式的流就不合适了。Retract流有几种类型的事件类型:

ADD MESSAGE:这种消息对应的就是INSERT操作。

RETRACT MESSAGE:直译过来叫取消消息。这种消息对应的就是DELETE操作。

我们可以看到通过ADD MESSAGE和RETRACT MESSAGE可以很好的向外部系统表达删除和插入操作。那如何进行UPDATE呢?好办!RETRACT MESSAGE + ADD MESSAGE即可。先把之前的数据进行删除,然后插入一条新的。完美~

  • Upsert流

前面我们看到的RETRACT编码方式的流,实现UPDATE是使用DELETE + INSERT模式的。大家想一下:在MySQL中我们更新数据的时候,肯定不会先DELETE掉一条数据,然后再插入一条数据,肯定是直接发出UPDATE语句执行更新。而Upsert编码方式的流,是能够支持Update的,这种效率更高。它同样有两种类型的消息:

UPSERT MESSAGE:这种消息可以表示要对外部系统进行Update或者INSERT操作

DELETE MESSAGE:这种消息表示DELETE操作。

Upsert流是要求必须指定Primary Key的,因为Upsert操作是要有Key的。Upsert流针对UPDATE操作用一个UPSERT MESSAGE就可以描述,所以效率会更高。

2021年大数据Flink(三十三):​​​​​​​Table与SQL相关概念相关推荐

  1. 2021年大数据Flink(十三):流批一体API Sink

    目录 Sink 预定义Sink 基于控制台和文件的Sink 自定义Sink MySQL Sink 预定义Sink 基于控制台和文件的Sink API 1.ds.print 直接输出到控制台 2.ds. ...

  2. 2021年大数据HBase(十三):HBase读取和存储数据的流程

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase读取和存储数据的流程 一.HBase读取数据的流程 ...

  3. 2021年大数据Flink(三十七):​​​​​​​Table与SQL ​​​​​​案例四

    目录 案例四 需求 代码实现 案例四 需求 从Kafka中消费数据并过滤出状态为success的数据再写入到Kafka {"user_id": "1", &qu ...

  4. 2021年大数据Flink(三十):Flink ​​​​​​​Table API  SQL 介绍

    目录 ​​​​​​​Table API & SQL 介绍 为什么需要Table API & SQL ​​​​​​​Table API& SQL发展历程 架构升级 查询处理器的选 ...

  5. 2021年大数据Flink(三十二):​​​​​​​Table与SQL案例准备 API

    目录 API 获取环境 创建表 查询表 Table API SQL ​​​​​​​写出表 ​​​​​​​与DataSet/DataStream集成 ​​​​​​​TableAPI ​​​​​​​SQL ...

  6. 2021年大数据Flink(十):流处理相关概念

    目录 流处理相关概念 数据的时效性 ​​​​​​​流处理和批处理 ​​​​​​​流批一体API DataStream API 支持批执行模式 API 编程模型 ​​​​​​​流处理相关概念 数据的时效 ...

  7. 2021年大数据Flink(四十八):扩展阅读  Streaming File Sink

    目录 扩展阅读  Streaming File Sink 介绍 场景描述 Bucket和SubTask.PartFile 案例演示 扩展阅读  配置详解 PartFile PartFile序列化编码 ...

  8. 2021年大数据Flink(四十六):扩展阅读 异步IO

    目录 扩展阅读  异步IO 介绍 异步IO操作的需求 使用Aysnc I/O的前提条件 Async I/O API 案例演示 扩展阅读 原理深入 AsyncDataStream 消息的顺序性 扩展阅读 ...

  9. 2021年大数据Flink(四十二):​​​​​​​BroadcastState

    ​​​​​目录 ​BroadcastState BroadcastState介绍 需求-实现配置动态更新 编码步骤 1.env 2.source 3.transformation 4.sink 5.e ...

最新文章

  1. 问答平台元老Yahoo Answers宣布将永久关闭,网友:爷青结
  2. python 仪表盘-跟小白学Python数据分析——绘制仪表盘
  3. 【机器学习基础】数学推导+纯Python实现机器学习算法13:Lasso回归
  4. Boost:std ::bind与Boost的_1绑定的测试程序
  5. 维护SAP帮助信息(WEB)
  6. Keil(MDK-ARM-STM32)系列教程(一)_新建软件工程详细过程
  7. 中车四方时速600公里高速磁浮试验样车试跑成功
  8. Android图片爬虫,看妹纸神器项目源码,ListView单张图片查看
  9. vue中使用富文本编辑器wangEditor及踩坑
  10. 我叫金三顺的经典爱情名言
  11. Python3 Tkinter 之 (1) 主窗口框架
  12. linux vim 编译python,Ubuntu下编译Vim8(+python)无数次编译失败
  13. O2O供应链系统架构设计
  14. python中abs函数是什么意思_python abs函数怎么用
  15. LSD_SLAM 编译、安装到运行demo
  16. 使用GO实现尚硅谷家庭记账系统
  17. WIN10开机显示被调用的对象已与其客户端断开连接解决方法之一
  18. 【SHELL】shell脚本入门
  19. 作为传送信息的公共通道 微型计算机的系统,微型计算机的系统总线是CPU与其他部件之间传送( )信息的公共通道...
  20. Louvain 社团发现算法学习(我的java实现+数据用例)

热门文章

  1. 2022-2028年中国氮肥行业投资分析及前景预测报告
  2. libIlmImf-2_2.so.22 :cannot open shared object file :No such file or direct
  3. 一阶逻辑与二阶逻辑的区别一元谓词多元谓词
  4. 《attention is all you need》解读
  5. [PyTorch] rnn,lstm,gru中输入输出维度
  6. LeetCode简单题之去掉最低工资和最高工资后的工资平均值
  7. LeetCode简单题之两数之和 IV - 输入 BST
  8. LeetCode简单题之图像渲染
  9. Arm Cortex-M3 MCU性能
  10. BEP 7:CUDA外部内存管理插件(下)