全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件
流计算

DDL总览

更新时间:2018-01-18 16:39:00

语法:

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

说明:

阿里云流计算本身不带有数据存储功能,因此所有的涉及表创建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. );

这里是在流计算SQL中并非创建一个datahub的Topic,仅仅声明了一个名称为tt_stream的表引用,下游所有的对这张datahub的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系统,这类系统在表存储级别定义了字段名称以及字段类型,强烈推荐用户在流计算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;
本文导读目录