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='', accessKey=' ' );
以上代码不是在Flink SQL中创建了消息队列(MQ)源表的topic,而是声明了一个名称为mq_stream的表引用。下游所有对MQblink_mq_testTopic的相关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='', accessKey=' ' );
名称映射
适用于带有Schema的系统。这类系统在表存储级别定义了字段名称以及字段类型,支持根据KEY取值。建议您在Flink SQL的声明中保持和外部数据存储Schema定义一致,包括字段名称、字段数量以及字段的顺序。
说明 如果外部数据存储的字段名称是大小写敏感类型,例如,表格存储(Table Store),则需要在区分大小写的字段名称处,使用反引号(``)进行转换。在DDL语法中,声明表的字段名和外部表的字段名需要一致。
DataHub定义的Schema如下:
说明 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='', accessKey=' ' project='project', topic='topic' );
小结说明 建议您将所有列进行声明引用。声明引用时可以减少字段,不能新增字段。
对于顺序映射的数据源,不可以减少声明的字段,必须保证Flink SQL作业中声明数据源的字段数量、顺序和数据源保持完全一致。对于名称映射的数据源,可以减少声明引用的字段(即声明的字段数量比数据源少),但是不能新增字段。 处理大小写敏感
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;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)