本文为您介绍实时计算Flink版DDL语法,以及在DDL使用过程中需要注意的字段映射和大小写敏感问题。
语法
CREATE TABLE tableName
(columnName dataType [, columnName dataType ]*)
[ WITH (propertyName=propertyValue [, propertyName=propertyValue ]*) ];
说明
阿里云实时计算Flink版本身不具有数据存储功能,所有涉及表创建的DDL操作,实际上均是对外部数据表、存储的引用声明。
CREATE TABLE mq_stream(
a VARCHAR,
b VARCHAR,
c VARCHAR
) WITH (
type='mq',
topic='blink_mq_test',
accessID='<yourAccessID>',
accessKey='<yourAccessSecret>'
);
以上代码不是在Flink SQL中创建了消息队列(MQ)源表的topic,而是声明了一个名称为
mq_stream
的表引用。下游所有对MQblink_mq_test
Topic的相关DML操作,均可以使用别名mq_stream
代替。声明外部表时,请注意:
- 实时计算Flink版声明表的作用域是当前作业(1个SQL文件提交后生成1个实时计算作业),即上述有关
mq_stream
的声明仅在当前SQL有效。相同实时计算项目下不同SQL文件(作业)中同样可以声明名称为mq_stream
的表。 - 按照SQL标准定义,DDL语法中关键字、表名、列名等不区分大小写。
- 表名、列名必须以字母开头,并且名称中只能包含字母、数字或下划线。
- DDL声明不完全根据名称进行映射(取决于上游插件的性质)。建议您引用声明的字段名称、字段个数和外部表保持一致,避免因定义混乱而导致数据错乱。
说明
- 如果上下游插件支持根据KEY取值,则不要求两者字段数量一致,但字段名称需要一致。
- 如果上下游插件不支持根据KEY取值,则需要字段数量和字段顺序一致。
字段映射
声明表的字段映射根据外部数据源是否有Schema,分为两大类:
- 顺序映射
适用于以MQ为代表的不带有Schema的系统。这类系统通常是非结构化存储系统,不支持根据KEY取值。建议您在DDL SQL声明中对字段名称进行自定义,并且和外部表的字段类型、字段数量保持一致。
以MQ的1条记录为例。asavfa,sddd32,sdfds
按照命名规范设置MQ的字段名。CREATE TABLE mq_stream( a VARCHAR, b VARCHAR, c VARCHAR ) WITH ( type='mq', topic='blink_mq_test', accessID='<yourAccessID>', accessKey='<yourAccessSecret>' );
- 名称映射
适用于带有Schema的系统。这类系统在表存储级别定义了字段名称以及字段类型,支持根据KEY取值。建议您在Flink SQL的声明中保持和外部数据存储Schema定义一致,包括字段名称、字段数量以及字段的顺序。说明 如果外部数据存储的字段名称是大小写敏感类型,例如,表格存储,则需要在区分大小写的字段名称处,使用反引号(``)进行转换。在DDL语法中,声明表的字段名和外部表的字段名需要一致。DataHub定义的Schema如下:
字段名 类型 name STRING age BIGINT value STRING 说明 DataHub中的STRING数据类型对应实时计算Flink版中的VARCHAR类型。关于上述DataHub声明的DDL如下:create table stream_result ( `name` varchar, age bigint, `value` varchar ) with ( type='datahub', endpoint='http://dh-cn-hangzhou.aliyuncs.com', accessID='<yourAccessID>', accessKey='<yourAccessSecret>' project='project', topic='topic' );
说明 建议您将所有列进行声明引用。声明引用时可以减少字段,不能新增字段。
处理大小写敏感
SQL标准定义中,大小写是不敏感的。如下两个示例,语句的含义相同。
create table stream_result (
name varchar,
value varchar
);
create table STREAM_RESULT (
NAME varchar,
VALUE varchar
);
实时计算Flink版引用的大量外部数据源中,有时会存在要求大小写敏感的数据源。例如,表格存储(Table Store)对于大小写是敏感的。如果需要在Table Store定义大写
NAME
字段,您应该进行如下定义。
create table STREAM_RESULT (
`NAME` varchar,
`VALUE` varchar
);
在之后所有的DML操作中,对于这个字段的引用均需要添加反引号(``),如下所示。
INSERT INTO tableA
SELECT
`NAME`,
`VALUE`
FROM
tableB;