Flink SQL DDL(Data Definition Language)基本语法介绍。
一、数据库
创建数据库
- 语法
CREATE DATABASE [IF NOT EXISTS] [catalog_name.]db_name
[COMMENT database_comment]
WITH (key1=val1, key2=val2, ...)
- 案例
CREATE DATABASE db_pyflink;
查询数据库
# 查询所有数据库
SHOW DATABASES
# 查询当前数据库
SHOW CURRENT DATABASE
修改数据库
# 语法
ALTER DATABASE [catalog_name.]db_name SET (key1=val1, key2=val2, ...)
删除数据库
# 语法
DROP DATABASE [IF EXISTS] [catalog_name.]db_name [ (RESTRICT | CASCADE) ]
# 案例
DROP DATABASE db_pyflink;
- RESTRICT:删除非空数据库会触发异常,默认启用。
- CASCADE:删除非空数据库也会删除所有相关的表和函数。
切换当前数据库
USE database_name;
二、表
创建表
- 语法
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> )] | AS select_query ]
- physical_column_definition:物理列是数据库中所说的常规列。其定义了物理介质中存储的数据中字段的名称、类型和顺序。其他类型的列可以在物理列之间声明,但不会影响最终的物理列的读取。
- metadata_column_definition:元数据列是 SQL 标准的扩展,允许访问数据源本身具有的一些元数据,元数据列由 METADATA 关键字标识。
CREATE TABLE MyTable (
`user_id` BIGINT,
`name` STRING,
`record_time` TIMESTAMP_LTZ(3) METADATA FROM 'timestamp'
) WITH (
'connector' = 'kafka'
...
);
例如,我们可以使用元数据列从Kafka记录中读取和写入时间戳,用于基于时间的操作(这个时间戳不是数据中的某个时间戳字段,而是数据写入 Kafka 时,Kafka 引擎给这条数据打上的时间戳标记)。connector和format文档列出了每个组件可用的元数据字段。
-
computed_column_definition:计算列是使用语法column_name AS computed_column_expression生成的虚拟列。
它是拿已有的一些列经过一些自定义的运算生成的新列,在物理上并不存储在表中,只能读不能写。列的数据类型从给定的表达式自动派生,无需手动声明
。 -
定义Watermark:Flink SQL 提供了几种 WATERMARK 生产策略。
- 严格升序:
WATERMARK FOR rowtime_column AS rowtime_column
:Flink 任务认为时间戳只会越来越大,也不存在相等的情况,只要相等或者小于之前的,就认为是迟到的数据。 - 递增:
WATERMARK FOR rowtime_column AS rowtime_column - INTERVAL '0.001' SECOND
:一般基本不用这种方式。如果设置此类,则允许有相同的时间戳出现。 - 有界无序:
WATERMARK FOR rowtime_column AS rowtime_column – INTERVAL 'string' timeUnit
:此类策略就可以用于设置最大乱序时间,假如设置为WATERMARK FOR rowtime_column AS rowtime_column - INTERVAL '5' SECOND ,则生成的是运行 5s 延迟的Watermark
。一般都用这种 Watermark 生成策略,此类 Watermark 生成策略通常用于有数据乱序的场景中,而对应到实际的场景中,数据都是会存在乱序的,所以基本都使用此类策略。
- 严格升序:
-
PRIMARY KEY:主键约束表明表中的一列或一组列是唯一的,并且它们不包含NULL值。主键唯一地标识表中的一行,只支持 not enforced。
-
PARTITIONED BY:创建分区表。
-
with语句:用于创建表的表属性,用于指定外部存储系统的元数据信息。配置属性时,表达式key1=val1的键和值都应该是字符串字面值。如下是Kafka的映射表:
CREATE TABLE KafkaTable (
`user_id` BIGINT,
`name` STRING,
`ts` TIMESTAMP(3) METADATA FROM 'timestamp'
) WITH (
'connector' = 'kafka',
'topic' = 'user_behavior',
'properties.bootstrap.servers' = 'localhost:9092',
'properties.group.id' = 'testGroup',
'scan.startup.mode' = 'earliest-offset',
'format' = 'csv'
)
# 一般 with 中的配置项由 Flink SQL 的 Connector(链接外部存储的连接器) 来定义,每种 Connector 提供的with 配置项都是不同的。
- AS select_statement(CTAS):在一个create-table-as-select (CTAS)语句中,还可以通过查询的结果创建和填充表。CTAS是使用单个命令创建数据并向表中插入数据的最简单、最快速的方法。
CREATE TABLE my_ctas_table
WITH (
'connector' = 'kafka',
...
)
AS SELECT id, name, age FROM source_table WHERE mod(id, 10) = 0;
注意:CTAS有以下限制:
- 暂不支持创建临时表
- 目前还不支持指定显式列
- 还不支持指定显式水印
- 目前还不支持创建分区表
- 目前还不支持指定主键约束
- 简单建表示例
CREATE TABLE test(
id INT,
ts BIGINT,
vc INT
) WITH (
'connector' = 'print'
);
CREATE TABLE test1 (
`value` STRING
)
LIKE test;
查看表
- 查看所有表
SHOW TABLES [ ( FROM | IN ) [catalog_name.]database_name ] [ [NOT] LIKE <sql_like_pattern> ]
如果没有指定数据库,则从当前数据库返回表。LIKE子句中sql pattern的语法与MySQL方言的语法相同:
%匹配任意数量的字符,甚至零字符,%匹配一个'%'字符
_只匹配一个字符,_只匹配一个'_'字符
- 查看表信息
{ DESCRIBE | DESC } [catalog_name.][db_name.]table_name
desc event_table;
- 修改表
# 修改表名
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, ...)
- 删除表
DROP [TEMPORARY] TABLE [IF EXISTS] [catalog_name.][db_name.]table_name