阅读249 返回首页    go 阿里云 go 技术社区[云栖]


DDL语句__SQL_大数据计算服务-阿里云

创建表

语法格式

  1. CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
  2. [(col_name data_type [COMMENT col_comment], ...)]
  3. [COMMENT table_comment]
  4. [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  5. [LIFECYCLE days]
  6. [AS select_statement]
  7. [STORED BY StorageHandler] -- 仅限外部表
  8. [WITH SERDEPROPERTIES (Options)] -- 仅限外部表
  9. [LOCATION OSSLocation];-- 仅限外部表
  10. CREATE TABLE [IF NOT EXISTS] table_name
  11. LIKE existing_table_name

说明:

  • 表名与列名均对大小写不敏感。
  • 在创建表时,如果不指定if not exists选项而存在同名表,则返回出错;若指定此选项,则无论是否存在同名表,即使原表结构与要创建的目标表结构不一致,均返回成功。已存在的同名表的元信息不会被改动。
  • 数据类型只能是:bigint,double,boolean,datetime及string。
  • 表名,列名中不能有特殊字符,只能用英文的a-z,A-Z及数字和下划线_,且以字母开头,名称的长度不超过128字节。
  • Partitioned by 指定表的分区字段,目前仅支持string类型。分区值不允许有双字节字符(如中文),必须是以英文字母a-z,A-Z开始后可跟字母数字,名称的长度不超过128字节。 允许的字符包括:空格 ‘ ‘,冒号’:’,下划线’_’,美元符’$’,井号’#’,点’.’,感叹号’!’和’@’,出现其他字符行为未定义,例如:”t”,”n”,”/”等。当利用分区字段对表进行分区时,新增分区、更新分区内数据和读取分区数据均不需要做全表扫描,可以提高处理效率。
  • 注释内容是长度不超过1024字节的有效字符串。
  • lifecycle指明此表的生命周期,create table like语句不会复制源表的生命周期属性。
  • 目前,在表中建的分区层次不能超过6级。
  • 更多有关外部表的说明请参考云栖社区文章之MaxCompute上如何处理非结构化数据

在下面的例子中,创建表sale_detail保存销售记录,该表使用销售时间(sale_date)和销售区域(region)作为分区列:

  1. create table if not exists sale_detail(
  2. shop_name string,
  3. customer_id string,
  4. total_price double)
  5. partitioned by (sale_date string,region string);
  6. -- 创建一张分区表sale_detail

也可以通过create table … as select ..语句创建表,并在建表的同时将数据复制到新表中,如

  1. create table sale_detail_ctas1 as
  2. select * from sale_detail;

此时,如果sale_detail中存在数据,上面的示例会将sale_detail的数据全部复制到sale_detail_ctas1表中。但请注意,此处sale_detail是一张分区表,而通过create table … as select … 语句创建的表不会复制分区属性,只会把源表的分区列作为目标表的一般列处理,即sale_detail_ctas1是一个含有5列的非分区表。

在create table … as select …语句中,如果在select子句中使用常量作为列的值,建议指定列的名字,例如:

  1. create table sale_detail_ctas2 as
  2. select shop_name,
  3. customer_id,
  4. total_price,
  5. '2013' as sale_date,
  6. 'China' as region
  7. from sale_detail;

如果不加列的别名,如:

  1. create table sale_detail_ctas3 as
  2. select shop_name,
  3. customer_id,
  4. total_price,
  5. '2013',
  6. 'China'
  7. from sale_detail;

则创建的表sale_detail_ctas3的第四、五列会是类似_c5_c6。 如果希望源表和目标表具有相同的表结构,可以尝试使用create table ... like操作,如:

  1. create table sale_detail_like like sale_detail;

此时,sale_detail_like的表结构与sale_detail完全相同。除生命周期属性外,列名、列注释以及表注释等均相同。但sale_detail中的数据不会被复制到sale_detail_like表中。

删除表

语法格式

  1. DROP TABLE [IF EXISTS] table_name;

说明:

  • 如果不指定if exists选项而表不存在,则返回异常;若指定此选项,无论表是否存在,皆返回成功。
  • 删除外部表时,OSS上的数据不会被删除;

示例:

  1. create table sale_detail_drop like sale_detail;
  2. drop table sale_detail_drop;
  3. --若表存在,成功返回;若不存在,异常返回;
  4. drop table if exists sale_detail_drop2;
  5. --无论是否存在sale_detail_drop2表,均成功返回;

重命名表

语法格式

  1. ALTER TABLE table_name RENAME TO new_table_name;

说明:

  • rename操作仅修改表的名字,不改动表中的数据。
  • 如果已存在与new_table_name同名表,报错。
  • 如果table_name不存在,报错:

示例:

  1. create table sale_detail_rename1 like sale_detail;
  2. alter table sale_detail_rename1 rename to sale_detail_rename2;

修改表的注释

命令格式:

  1. ALTER TABLE table_name SET COMMENT 'tbl comment';

说明:

  • table_name必须是已存在的表;comment最长1024字节;

示例:

  1. alter table sale_detail set comment 'new coments for table sale_detail';

通过 MaxCompute 的desc命令可以查看表中comment的修改,请参阅 查看表信息

修改表的生命周期属性

MaxCompute 提供数据生命周期管理功能,方便用户释放存储空间,简化回收数据的流程。

语法格式:

  1. ALTER TABLE table_name SET lifecycle days;

说明:

  • days 参数为生命周期时间,只接受正整数。单位:天;

如果表table_name是非分区表,自最后一次数据被修改开始计算,经过days天后数据仍未被改动,则此表无需用户干预,

将会被 MaxCompute 自动回收(类似drop table操作)。在 MaxCompute 中,每当表的数据被修改后,表的LastDataModifiedTime将会被更新,因此,

MaxCompute 会根据每张表的LastDataModifiedTime以及lifecycle的设置来判断是否要回收此表。如果table_name是分区表,

则根据各分区的LastDataModifiedTime判断该分区是否该被回收。关于LastDataModifiedTime的介绍请参考 查看表信息

不同于非分区表,分区表的最后一个分区被回收后,该表不会被删除。生命周期只能设定到表级别,不能再分区级设置生命周期。创建表时即可指定生命周期。

示例:

  1. create table test_lifecycle(key string) lifecycle 100;
  2. -- 新建test_lifecycle表,生命周期为100天。
  3. alter table test_lifecycle set lifecycle 50;
  4. -- 修改test_lifecycle表,将生命周期设为50天。

修改表的修改时间

MaxCompute SQL提供touch操作用来修改表的LastDataModifiedTime。效果会将表的LastDataModifiedTime修改为当前时间。

语法格式:

  1. ALTER TABLE table_name TOUCH;

说明:

  • table_name不存在,则报错返回;;
  • 此操作会改变表的”LastDataModifiedTime”的值,此时,MaxCompute 会认为表的数据有变动,生命周期的计算会重新开始。

清空非分区表里的数据

将指定的非分区表中的数据清空, 该命令不支持分区表。对于分区表,可以用ALTER TABLE table_name DROP PARTITION的方式将分区里的数据清除。

语法格式:

  1. TRUNCATE TABLE table_name;

视图操作

创建视图

语法格式

  1. CREATE [OR REPLACE] VIEW [IF NOT EXISTS] view_name
  2. [(col_name [COMMENT col_comment], ...)]
  3. [COMMENT view_comment]
  4. [AS select_statement]

说明:

  • 创建视图时,必须有对视图所引用表的读权限。
  • 视图只能包含一个有效的select语句。
  • 视图可以引用其它视图,但不能引用自己,也不能循环引用。
  • 不允许向视图写入数据,例如使用insert into 或者insert overwrite操作视图。
  • 当视图建好以后,如果视图的引用表发生了变更,有可能导致视图无法访问,例如:删除被引用表。用户需要自己维护引用表及视图之间的对应关系。
  • 如果没有指定if not exists,在视图已经存在时用create view会导致异常。这种情况可以用create or replace view来重建视图,重建后视图本身的权限保持不变。

示例:

  1. create view if not exists sale_detail_view
  2. (store_name, customer_id, price, sale_date, region)
  3. comment 'a view for table sale_detail'
  4. as select * from sale_detail;

删除视图

语法格式

  1. DROP VIEW [IF EXISTS] view_name;

说明:

  • 如果视图不存在且没有指定if exists,报错。

示例:

  1. DROP VIEW IF EXISTS sale_detail_view;

重命名视图

语法格式

  1. ALTER VIEW view_name RENAME TO new_view_name;

说明:

  • 如果已存在同名视图,报错。

示例:

  1. create view if not exists sale_detail_view
  2. (store_name, customer_id, price, sale_date, region)
  3. comment 'a view for table sale_detail'
  4. as select * from sale_detail;
  5. alter view sale_detail_view rename to market;

分区/列操作

添加分区

语法格式:

  1. ALTER TABLE TABLE_NAME ADD [IF NOT EXISTS] PARTITION partition_spec
  2. partition_spec:
  3. : (partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)

说明:

  • 如果未指定if not exists而同名的分区已存在,则出错返回。
  • 目前 MaxCompute 支持的分区数量上限为6万。
  • 对于多级分区的表,如果想添加新的分区,必须指明全部的分区值。

示例:为sale_detail表添加一个新的分区,

  1. alter table sale_detail add if not exists partition (sale_date='201312', region='hangzhou');
  2. -- 成功添加分区,用来存储2013年12月杭州地区的销售记录。
  3. alter table sale_detail add if not exists partition (sale_date='201312', region='shanghai');
  4. -- 成功添加分区,用来存储2013年12月上海地区的销售记录。
  5. alter table sale_detail add if not exists partition(sale_date='20111011');
  6. -- 仅指定一个分区sale_date,出错返回
  7. alter table sale_detail add if not exists partition(region='shanghai');
  8. -- 仅指定一个分区region,出错返回

删除分区

  1. ALTER TABLE TABLE_NAME DROP [IF EXISTS] PARTITION partition_spec;
  2. partition_spec:
  3. : (partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)

说明:

  • 如果分区不存在且未指定if exists,则出错返回。

示例:从表sale_detail中删除一个分区,

  1. alter table sale_detail drop if exists partition(sale_date='201312',region='hangzhou');
  2. -- 成功删除2013年12月杭州分区的销售。

添加列

命令格式:

  1. ALTER TABLE table_name ADD COLUMNS (col_name1 type1, col_name2 type2...)

说明:

  • 列的数据类型只能是:bigint,double,boolean,datetime及string类型。

修改列名

命令格式:

  1. ALTER TABLE table_name CHANGE COLUMN old_col_name RENAME TO new_col_name;

说明:

  • old_col_name必须是已存在的列;
  • 表中不能有名为new_col_name的列;

修改列、分区注释

命令格式:

  1. ALTER TABLE table_name CHANGE COLUMN col_name COMMENT comment_string;

说明:

  • COMMENT内容最长1024字节;

同时修改列名及列注释

命令格式:

  1. ALTER TABLE table_name CHANGE COLUMN old_col_name new_col_name column_type COMMENT column_comment;

说明:

  • old_col_name必须是已存在的列;
  • 表中不能有名为new_col_name的列;
  • COMMENT内容最长1024字节;

修改表、分区的修改时间

MaxCompute SQL提供touch操作用来修改分区的LastDataModifiedTime。效果会将分区的LastDataModifiedTime修改为当前时间。

语法格式:

  1. ALTER TABLE table_name TOUCH PARTITION(partition_col='partition_col_value', ...);

说明:

  • table_name或partition_col不存在,则报错返回;
  • 指定的partition_col_value不存在,则报错返回;
  • 此操作会改变表的”LastDataModifiedTime”的值,此时, MaxCompute 会认为表或分区的数据有变动,生命周期的计算会重新开始。

修改分区值

MaxCompute SQL支持通过rename操作更改对应表的分区值。

语法格式:

  1. ALTER TABLE table_name PARTITION (partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)
  2. RENAME TO PARTITION (partition_col1 = partition_col_newvalue1, partition_col2 = partiton_col_newvalue2, ...);

说明:

  • 不支持修改分区列列名,只能修改分区列对应的值。
  • 修改多级分区的一个或者多个分区值,多级分区的每一级的分区值都必须写上。

最后更新:2016-11-23 17:16:04

  上一篇:go 运算符__SQL_大数据计算服务-阿里云
  下一篇:go DML语句__SQL_大数据计算服务-阿里云