DDL概述

语法

 
  
  1. CREATE TABLE tableName
  2. (columnName dataType [, columnName dataType ]*)
  3. [ WITH (propertyName=propertyValue [, propertyName=propertyValue ]*) ];

说明

阿里云实时计算 Flink本身不带有数据存储功能,因此所有涉及表创建DDL的操作,实际上均是对于外部数据表、存储的引用声明。例如下列操作。

 
  
  1. create table tt_stream(
  2. a varchar,
  3. b varchar,
  4. c varchar
  5. ) with (
  6. type='datahub',
  7. topic='blink_tt_test',
  8. accessId='06xxxxxxxxx',
  9. accessKey='a6xxxxxxxxxxxxxxxxxxxxxxxxxx'
  10. );

此处并非是在实时计算Flink SQL中创建一个DataHub的Topic,而是声明了一个名称为tt_stream的表引用。下游所有对这张Topic相关的DML操作均可以使用tt_stream别名来进行操作。

  • 实时计算对于声明表的作用域是在当前作业(一个SQL文件提交后生成一个实时计算作业),即上述有关tt_stream的声明仅在当前SQL有效。在同一个Project下的其他SQL文件同样可以声明名称为tt_stream的表。

  • 按照SQL标准定义,DDL语法中关键字、表名、列名等不区分大小写。

  • 表名、列名必须以字母或者数字开头,并且名称中只能包含字母、数字、下划线。

  • DDL声明不完全根据名称进行映射(取决于上游插件的性质)。如果插件支持根据key取值(如DataHub),则不要求字段个数完全一致。但名称需要一致。如果上游插件不支持根据key取值(如TT),则对字段数量和顺序有严格要求。实时计算建议您引用声明的字段名称、个数和外部表一致,避免出现定义混乱导致数据错乱的情况。
    因此,我们推荐名称、列数、顺序完全一致

字段映射

根据外部数据源是否有Schema分为两大类别。

顺序映射

适用于以TT、MetaQ为代表的不带有Schema系统。这类系统通常是非结构化存储系统。推荐的操作是,您可以在DDL SQL声明中对字段名称进行自定义,但需按照外部表字段的类型、列数进行对齐。

以TT为例,TT的一条记录格式:

 
  
  1. asavfa,sddd32,sdfdsv

示例,TT的字段名按照命名规范来设置。

 
  
  1. create table tt_stream(
  2. a varchar,
  3. b varchar,
  4. c varchar
  5. ) with (
  6. type='tt',
  7. topic='blink_tt_test',
  8. accessId='0622XXXXXX',
  9. accessKey='a62cfe8XXXXXXXXX'
  10. );

名称映射

适用于以DataHub、TDDL为代表的带有Schema的系统。这类系统在表存储级别定义了字段名称以及字段类型。推荐您在Flink SQL中严格按照外部数据存储Schema进行定义,包括名称、列数、顺序完全一致

注意:
如果外部数据存储的字段名称是大小写敏感类型(例如OTS),则在流计算SQL中需要在区分大小写的字段名称处使用‘`’进行转换。以DataHub为例,在DDL语法中,声明字段名和目标表的字段名需要名称完全一致。

Datahub定义的Schema如下:

字段名
类型
name
varchar
age
bigint
value
varchar

我们推荐用户将所有列进行声明引用,注意可以少字段,不可以多字段。针对上述DataHub声明的DDL如下:

 
  
  1. create table stream_result (
  2. name varchar,
  3. age bigint,
  4. value varchar
  5. ) with (
  6. type='datahub',
  7. endpoint='http://dh-cn-hangzhou.aliyuncs.com',
  8. accessId='xxxxxx',
  9. accessKey='xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  10. project='project',
  11. topic='topic'
  12. );

处理大小写敏感

SQL标准定义中,大小写是不敏感的,例如:

 
  
  1. create table stream_result (
  2. name varchar,
  3. value varchar
  4. );

和下列语句含义一致:

 
  
  1. create table STREAM_RESULT (
  2. NAME varchar,
  3. VALUE varchar
  4. );

但实时计算引用的大量外部数据源,可能要求大小写敏感。例如,TableStore对于大小写是敏感的。如果在TableStore定义了一个NAME的大写字段,我们应该如下定义:

 
  
  1. create table STREAM_RESULT (
  2. `NAME` varchar,
  3. `VALUE` varchar
  4. );

在之后所有的DML操作中,对于这个字段引用均需要添加反引号,例如:

 
  
  1. INSERT INTO xxx
  2. SELECT
  3. `NAME`,
  4. `VALUE`
  5. FROM
  6. XXX;

本文转自实时计算——DDL概述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值