Flink学习之flink sql

article/2025/9/17 3:49:12

🌰 昨天我们学习完Table API后,今天我们继续学SQL,Table API和SQL可以处理SQL语言编写的查询语句,但是这些查询需要嵌入用Java、Scala和python编写的程序中。

  • hadoop专题: hadoop系列文章.
  • spark专题: spark系列文章.
  • flink专题: Flink系列文章.

🌱flink sql只需要具备 SQL 的基础知识即可,不需要其他编程经验。我的SQL 客户端选择的是docker安装的Flink SQL Click,大家根据自己的需求安装即可。

目录

  • 1. SQL客户端
  • 2. SQL语句
    • 2.1 create
    • 2.2 drop
    • 2.3 alter
    • 2.4 insert
    • 2.5 show
  • 3. Window Functions
    • 3.1 滚动窗口 TUMBLE
    • 3.2 滑动窗口 HOP
    • 3.3 累计窗口 CUMULATE
  • 4. 其他函数
  • 5. 总结
  • 6. 参考资料

1. SQL客户端

SQL客户端内置在Flink的版本中,大家只要启动即可,我使用的是docker环境中配置的Flink SQL Click,让我们测试一下:
在这里插入图片描述
输入’helloworld’ 看看输出的结果。

SELECT ‘hello world’;

结果如下:说明运行成功!
在这里插入图片描述

2. SQL语句

2.1 create

CREATE 语句用于向当前或指定的 Catalog 中注册表、视图或函数。注册后的表、视图和函数可以在 SQL 查询中使用。

CREATE TABLE [IF NOT EXISTS] [catalog_name.][db_name.]table_name({ <physical_column_definition> | <metadata_column_definition> | <computed_column_definition> }[ , ...n][ <watermark_definition> ][ <table_constraint> ][ , ...n])[COMMENT table_comment][PARTITIONED BY (partition_column_name1, partition_column_name2, ...)]WITH (key1=val1, key2=val2, ...)[ LIKE source_table [( <like_options> )] ]-- 例如
CREATE TABLE Orders_with_watermark (`user` BIGINT,product STRING,order_time TIMESTAMP(3),WATERMARK FOR order_time AS order_time - INTERVAL '5' SECOND 
) WITH ('connector' = 'kafka','scan.startup.mode' = 'latest-offset'
);

2.2 drop

DROP 语句可用于删除指定的 catalog,也可用于从当前或指定的 Catalog 中删除一个已经注册的表、视图或函数。

--删除表
DROP TABLE [IF EXISTS] [catalog_name.][db_name.]table_name
--删除数据库
DROP DATABASE [IF EXISTS] [catalog_name.]db_name [ (RESTRICT | CASCADE) ]
--删除视图
DROP [TEMPORARY] VIEW  [IF EXISTS] [catalog_name.][db_name.]view_name
--删除函数
DROP [TEMPORARY|TEMPORARY SYSTEM] FUNCTION [IF EXISTS] [catalog_name.][db_name.]function_name;

2.3 alter

ALTER 语句用于修改一个已经在 Catalog 中注册的表、视图或函数定义。

--修改表名
ALTER TABLE [catalog_name.][db_name.]table_name RENAME TO new_table_name
--设置或修改表属性
ALTER TABLE [catalog_name.][db_name.]table_name SET (key1=val1, key2=val2, ...)
--修改视图名
ALTER VIEW [catalog_name.][db_name.]view_name RENAME TO new_view_name
--在数据库中设置一个或多个属性。若个别属性已经在数据库中设定,将会使用新值覆盖旧值。
ALTER DATABASE [catalog_name.]db_name SET (key1=val1, key2=val2, ...)

2.4 insert

INSERT 语句用来向表中添加行(INTO是追加,OVERWRITE是覆盖)

-- 1. 插入别的表的数据
INSERT { INTO | OVERWRITE } [catalog_name.][db_name.]table_name [PARTITION part_spec] select_statement-- 2. 将值插入表中 
INSERT { INTO | OVERWRITE } [catalog_name.][db_name.]table_name VALUES [values_row , values_row ...]-- 追加行到该静态分区中 (date='2019-8-30', country='China')
INSERT INTO country_page_view PARTITION (date='2019-8-30', country='China')SELECT user, cnt FROM page_view_source;-- 追加行到分区 (date, country) 中,其中 date 是静态分区 '2019-8-30';country 是动态分区,其值由每一行动态决定
INSERT INTO country_page_view PARTITION (date='2019-8-30')SELECT user, cnt, country FROM page_view_source;-- 覆盖行到静态分区 (date='2019-8-30', country='China')
INSERT OVERWRITE country_page_view PARTITION (date='2019-8-30', country='China')SELECT user, cnt FROM page_view_source;-- 覆盖行到分区 (date, country) 中,其中 date 是静态分区 '2019-8-30';country 是动态分区,其值由每一行动态决定
INSERT OVERWRITE country_page_view PARTITION (date='2019-8-30')SELECT user, cnt, country FROM page_view_source;

2.5 show

show用于列出所有的catalog、database、function等

-- 列出catalog
SHOW CATALOGS;
-- 列出数据库
SHOW DATABASES;
--列出表
SHOW TABLES;
-- 列出视图
SHOW VIEWS;
--列出函数
SHOW FUNCTIONS;
-- 列出所有激活的 module
SHOW MODULES;

3. Window Functions

这里的Window Functions不是指我们sql中的窗口函数,是指处理流数据中特有的窗口操作。

3.1 滚动窗口 TUMBLE

TUMBLE函数把行分配到有固定间隔时间且不重叠的窗口上,滚动窗口在批处理和流处理可以定义在事件时间上,但只有流处理可以定义在处理时间上。
在这里插入图片描述

--1. TUMBLE函数的参数
TUMBLE(TABLE data, DESCRIPTOR(timecol), size [, offset ])
-- TABLE:代表数据源
-- DESCRIPTOR(timecol):指时间列
-- size:指窗口大小
-- offset:可增加其他参数,会有特别的意义-- 2.实例
SELECT window_start, window_end, SUM(price)FROM TABLE(TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES))GROUP BY window_start, window_end;

3.2 滑动窗口 HOP

滑动窗口在批处理和流处理中可以定义在事件时间上,但只有流处理可以定义在处理时间上。(数据会有重复)
在这里插入图片描述

-- 1. HOP函数的参数
HOP(TABLE data, DESCRIPTOR(timecol), slide, size [, offset ])
-- TABLE:代表数据源
-- DESCRIPTOR(timecol):指时间列
-- slide:指窗口滑动的大小
-- size:指窗口大小
-- offset:可增加其他参数,会有特别的意义-- 2.实例
SELECT window_start, window_end, SUM(price)FROM TABLE(CUMULATE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '2' MINUTES, INTERVAL '10' MINUTES))GROUP BY window_start, window_end;

3.3 累计窗口 CUMULATE

累计窗口是指在固定窗口内,每隔一段时间触发操作。类似于滚动窗口内定时进行累计操作。
在这里插入图片描述

--1. 累计窗口的参数
CUMULATE(TABLE data, DESCRIPTOR(timecol), step, size)
--data: 和时间有关的数据源
--timecol: 时间列,数据的哪些时间属性列应该映射到滚动窗口。
--step: 是指定顺序累积窗口结束之间增加的窗口大小的持续时间。
--size: 是指定累积窗口最大宽度的持续时间。size 必须是 step 的整数倍。
-- offset:可增加其他参数,会有特别的意义-- 实例
SELECT window_start, window_end, SUM(price)FROM TABLE(CUMULATE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '2' MINUTES, INTERVAL '10' MINUTES))GROUP BY window_start, window_end;

4. 其他函数

处理上述这些,剩下还有的操作都是和我们的SQL语法差不多,就不再阐述:

  • 窗口聚合函数:group by、…
  • 分组聚合函数:count、having、count(distinct xxx)、…
  • over聚合函数:over(partition by xxx order by xxx)、…
  • 内外连接函数:join、left join 、outer join、…
  • limit 函数
  • TOP-N函数: rank()、dense_rank()、row_number()

对以上内容感兴趣的小伙伴可以参考如下链接:

  • SQL教程: SQL专题-各部分函数讲解.

5. 总结

今天学习的sql,和往常不一样的地方在于,以往的sql都是处理的是批数据,而今天学习的flink sql可以处理流数据,流数据随着时间的变化而变化,flink sql可以对流数据进行类似表一样的处理,可以实现大部分DataStream API和DataSet API的功能。

😂还有就是,flink sql中的窗口函数和我们传统的窗口函数不一样,按理来说,我们正常的窗口函数应该叫over聚合函数

6. 参考资料

《Flink入门与实战》
《PyDocs》(pyflink官方文档)
《Kafka权威指南》
《Apache Flink 必知必会》
《Apache Flink 零基础入门》
《Flink 基础教程》


http://chatgpt.dhexx.cn/article/sxB42f5R.shtml

相关文章

SQL语句快速学习

​ 本文来自本福达的《SQL必知必会&#xff08;第5版&#xff09;》的学习总结。 如果之前学习过SQL相关知识&#xff0c;这篇文档将很有用。 开始&#xff1a; SQL语句不区分大小写&#xff0c;因此SELECT与select是相同的。同样&#xff0c;写成Select也没有关系。检索的基…

SQL学习笔记——REGEXP运算符

REGEXP运算符&#xff0c;是正则表达式&#xff08;regular expression&#xff09;的缩写&#xff0c;正则表达式在搜索字符串时非常强大&#xff0c;下面是关于它的应用 1.查找名字中包含field的顾客 select * from customers where last_name like %field% 运用REGEXP运算…

【SQL学习+练习篇】基础训练,适用于初学者(一)

SQL简介 SQL, 全称为Structured Query Language&#xff08;结构化查询语言)。 要讲SQL就绕不开database(数据库), 平时所说的数据库&#xff0c;一般就是指的 Relational database(关系型数据库). 大家知道数据库是用来存储大量数据的一种软件&#xff0c;那么SQL呢是用来操…

SQL学习四、过滤、数据筛选

数据过滤&#xff0c;即按照条件筛选数据&#xff0c;找出符合条件的数据。这可以说是SQL学习和使用时最核心的地方了。 1、使用简单WHERE 子句 WHERE 子句在表名&#xff08;FROM 子句&#xff09;之后给出 比如我们需要在 adjunctlist 中查询 flaw_id 201902的数据的add_t…

SQL学习——窗口函数

1.窗口函数 窗口函数&#xff1a;应用在窗口的函数&#xff0c;限定一个空间范围 窗口&#xff1a;记录集合&#xff0c;满足某种条件的记录集合上执行的特殊函数 基本用法&#xff1a; 函数名&#xff08;[expr]&#xff09; over 子句 函数&#xff08;&#xff09; over(…

数据分析初学入门——22本SQL学习书籍推荐

很多数据分析初学者都被推荐学SQL&#xff0c;SQL是最基础且是必备的技能之一&#xff0c;但是不知道该从何学起&#xff0c;很多课程讲了很多知识点&#xff0c;但是初学的朋友没有对这一领域整体框架的认识&#xff0c;不知道该学哪些知识、有哪些知识、实际工作需要到什么程…

Sql学习

Sql学习 一、SQL简介 SQL 是一种 ANSI&#xff08;American National Standards Institute 美国国家标准化组织&#xff09;标准的计算机语言。 是结构化查询语言&#xff08;Structured Query Language&#xff09;&#xff0c;可以访问和处理数据库&#xff0c;SQL 对大小写…

SQL学习笔记1

* 以下内容是我在学习SQL&#xff08;http://www.w3school.com.cn/sql/index.asp&#xff09;的时候的学习笔记 * 学习时使用的数据库软件是MySQL数据库可视化工具SQLyogEnt * 如果大家有发现什么不对的地方请告诉我。谢啦!!☆⌒(*&#xff3e;-゜)v * 在这里需要注意的是&…

史上最全SQL学习指南(教程+实例+练习题)

报告称&#xff0c;未来10年数据细分岗位将扩张5倍&#xff0c;大数据19w的人才缺口将继续增加。国内外一线互联网公司纷纷开设了数据分析岗位。 数据分析岗位中用的最频繁的工具就是SQL了。不论是满足业务日常取数需求&#xff0c;还是自己做分析&#xff0c;都离不开SQL。 …

SQL入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

导读&#xff1a; SQL语言有40多年的历史&#xff0c;从它被应用至今几乎无处不在。我们消费的每一笔支付记录&#xff0c;收集的每一条用户信息&#xff0c;发出去的每一条消息&#xff0c;都会使用数据库或与其相关的产品来存储&#xff0c;而操纵数据库的语言正是 SQL &…

SQL零基础入门必知必会!

&#x1f4da; 前言 SQL语言有40多年的历史&#xff0c;从它被应用至今几乎无处不在。我们消费的每一笔支付记录&#xff0c;收集的每一条用户信息&#xff0c;发出去的每一条消息&#xff0c;都会使用数据库或与其相关的产品来存储&#xff0c;而操纵数据库的语言正是 SQL &am…

redis:redis缓冲区溢出怎么办

引入 什么是缓冲区&#xff1a;用一块内存空间来暂时存放命令数据&#xff0c;以免出现因为数据和命令的处理速度慢与发送速度而导致的数据丢失和性能问题但是问题是&#xff0c;因为缓冲区的内存空间是有限的&#xff0c;如果往里面写入数据的速度大于从里面读取数据的速度&a…

【缓冲区溢出】堆溢出原理

一、操作系统中堆和栈的区别 堆内存申请&#xff0c;释放&#xff0c;操作&#xff0c;特点&#xff1a; 1. 堆内存申请环境:堆内存需要程序员在程序中申请 &#xff0c;动态分配&#xff0c;申请的大小有程序决定。 2. 堆内存申请方法&#xff1a;C语言中的malloc&#xff08;…

本地缓冲区溢出

本地缓冲区溢出 【实验目的】 1、掌握缓冲区溢出的基本原理&#xff1b; 2、熟练利用jmp.egp指令实现缓冲区溢出&#xff1b; 3、掌握缓冲区溢出的危害及其防范手段。 【实验环境】 登录Linux靶机环境&#xff0c;在无root权限的情况下&#xff0c;通过编译运行程序&#x…

关于缓冲区溢出(Buffer Overflow)

接触黑客的同志们经常遇到&#xff0c;使用一些扫描工具扫描的时候&#xff0c;会得到一些缓冲区溢出的漏洞&#xff0c;但是怎么利用自己是一团雾水 网上很少有相关的工具&#xff0c;也很少有相关的文章&#xff0c;下面我们就说说这个“窿西”吧 [蛋痛]文章丢失了一次&…

高并发缓存队列防止溢出解决方案

目录 1 背景介绍1.1 设计分析微信抢红包1.2 红包定时导入缓存队列 2 队列术限流2.1 高并发场景分析2.2 队列削峰实战 3 设计原则3.1 动静分离3.2 微服务化3.3 负载均衡3.4 异步消息3.5 缓存预热 4 Nginx通过LUA脚本访问RabbitMQ消息队列 1 背景介绍 并发量非常大的系统&#x…

【2021.12.12】缓冲区溢出利用

文章目录 1.1 实验环境和开发工具1.2 任务描述1.3 分析过程1.4 结论1.4.1 利用漏洞1.4.2 修复漏洞 1.1 实验环境和开发工具 处理器 i5-8300H 内存&#xff08;RAM&#xff09; 8G 硬盘 476G 软件环境&#xff1a; Windows 10 开发工具: Visual studio 2019 IDA PRO7.5 1.2 …

本地缓冲区溢出分析

栈溢出是缓冲区溢出中最为常见的一种攻击手法&#xff0c;其原理是&#xff0c;程序在运行时栈地址是由操作系统来负责维护的&#xff0c;在我们调用函数时&#xff0c;程序会将当前函数的下一条指令的地址压入栈中&#xff0c;而函数执行完毕后&#xff0c;则会通过ret指令从栈…

关于缓冲区溢出的对策

从编译器的角度出发 以下两种方法均是编译器采取的关于缓冲区溢出的对策 Stackshield 主要思想是在函数调用之前&#xff0c;将return address的副本保存在一个安全的地方&#xff0c;函数返回时将返回地址与预先保存的返回地址比较&#xff0c;以判断缓冲区溢出是否发生。 …

浅析缓冲区溢出

最近一直在学习缓冲区溢出漏洞的攻击&#xff0c;但是关于这一块的内容还是需要很多相关知识的基础&#xff0c;例如编程语言及反汇编工具使用。所以研究透彻还需要不少的时间&#xff0c;这里简单的做一个学习的总结&#xff0c;通过具体的实验案例对缓冲区溢出进行简要的解析…