DDL语句__SQL_大数据计算服务-阿里云
创建表
语法格式
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[LIFECYCLE days]
[AS select_statement]
[STORED BY StorageHandler] -- 仅限外部表
[WITH SERDEPROPERTIES (Options)] -- 仅限外部表
[LOCATION OSSLocation];-- 仅限外部表
CREATE TABLE [IF NOT EXISTS] table_name
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)作为分区列:
create table if not exists sale_detail(
shop_name string,
customer_id string,
total_price double)
partitioned by (sale_date string,region string);
-- 创建一张分区表sale_detail
也可以通过create table … as select ..语句创建表,并在建表的同时将数据复制到新表中,如
create table sale_detail_ctas1 as
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子句中使用常量作为列的值,建议指定列的名字,例如:
create table sale_detail_ctas2 as
select shop_name,
customer_id,
total_price,
'2013' as sale_date,
'China' as region
from sale_detail;
如果不加列的别名,如:
create table sale_detail_ctas3 as
select shop_name,
customer_id,
total_price,
'2013',
'China'
from sale_detail;
则创建的表sale_detail_ctas3的第四、五列会是类似_c5
,_c6
。 如果希望源表和目标表具有相同的表结构,可以尝试使用create table ... like
操作,如:
create table sale_detail_like like sale_detail;
此时,sale_detail_like
的表结构与sale_detail
完全相同。除生命周期属性外,列名、列注释以及表注释等均相同。但sale_detail
中的数据不会被复制到sale_detail_like
表中。
删除表
语法格式
DROP TABLE [IF EXISTS] table_name;
说明:
- 如果不指定if exists选项而表不存在,则返回异常;若指定此选项,无论表是否存在,皆返回成功。
- 删除外部表时,OSS上的数据不会被删除;
示例:
create table sale_detail_drop like sale_detail;
drop table sale_detail_drop;
--若表存在,成功返回;若不存在,异常返回;
drop table if exists sale_detail_drop2;
--无论是否存在sale_detail_drop2表,均成功返回;
重命名表
语法格式
ALTER TABLE table_name RENAME TO new_table_name;
说明:
- rename操作仅修改表的名字,不改动表中的数据。
- 如果已存在与new_table_name同名表,报错。
- 如果table_name不存在,报错:
示例:
create table sale_detail_rename1 like sale_detail;
alter table sale_detail_rename1 rename to sale_detail_rename2;
修改表的注释
命令格式:
ALTER TABLE table_name SET COMMENT 'tbl comment';
说明:
- table_name必须是已存在的表;comment最长1024字节;
示例:
alter table sale_detail set comment 'new coments for table sale_detail';
通过 MaxCompute 的desc
命令可以查看表中comment的修改,请参阅 查看表信息 。
修改表的生命周期属性
MaxCompute 提供数据生命周期管理功能,方便用户释放存储空间,简化回收数据的流程。
语法格式:
ALTER TABLE table_name SET lifecycle days;
说明:
- days 参数为生命周期时间,只接受正整数。单位:天;
如果表table_name是非分区表,自最后一次数据被修改开始计算,经过days天后数据仍未被改动,则此表无需用户干预,
将会被 MaxCompute 自动回收(类似drop table操作)。在 MaxCompute 中,每当表的数据被修改后,表的LastDataModifiedTime将会被更新,因此,
MaxCompute 会根据每张表的LastDataModifiedTime以及lifecycle的设置来判断是否要回收此表。如果table_name是分区表,
则根据各分区的LastDataModifiedTime判断该分区是否该被回收。关于LastDataModifiedTime的介绍请参考 查看表信息 。
不同于非分区表,分区表的最后一个分区被回收后,该表不会被删除。生命周期只能设定到表级别,不能再分区级设置生命周期。创建表时即可指定生命周期。
示例:
create table test_lifecycle(key string) lifecycle 100;
-- 新建test_lifecycle表,生命周期为100天。
alter table test_lifecycle set lifecycle 50;
-- 修改test_lifecycle表,将生命周期设为50天。
修改表的修改时间
MaxCompute SQL提供touch
操作用来修改表的LastDataModifiedTime
。效果会将表的LastDataModifiedTime
修改为当前时间。
语法格式:
ALTER TABLE table_name TOUCH;
说明:
- table_name不存在,则报错返回;;
- 此操作会改变表的”LastDataModifiedTime”的值,此时,MaxCompute 会认为表的数据有变动,生命周期的计算会重新开始。
清空非分区表里的数据
将指定的非分区表中的数据清空, 该命令不支持分区表。对于分区表,可以用ALTER TABLE table_name DROP PARTITION
的方式将分区里的数据清除。
语法格式:
TRUNCATE TABLE table_name;
视图操作
创建视图
语法格式
CREATE [OR REPLACE] VIEW [IF NOT EXISTS] view_name
[(col_name [COMMENT col_comment], ...)]
[COMMENT view_comment]
[AS select_statement]
说明:
- 创建视图时,必须有对视图所引用表的读权限。
- 视图只能包含一个有效的select语句。
- 视图可以引用其它视图,但不能引用自己,也不能循环引用。
- 不允许向视图写入数据,例如使用insert into 或者insert overwrite操作视图。
- 当视图建好以后,如果视图的引用表发生了变更,有可能导致视图无法访问,例如:删除被引用表。用户需要自己维护引用表及视图之间的对应关系。
- 如果没有指定if not exists,在视图已经存在时用create view会导致异常。这种情况可以用create or replace view来重建视图,重建后视图本身的权限保持不变。
示例:
create view if not exists sale_detail_view
(store_name, customer_id, price, sale_date, region)
comment 'a view for table sale_detail'
as select * from sale_detail;
删除视图
语法格式
DROP VIEW [IF EXISTS] view_name;
说明:
- 如果视图不存在且没有指定if exists,报错。
示例:
DROP VIEW IF EXISTS sale_detail_view;
重命名视图
语法格式
ALTER VIEW view_name RENAME TO new_view_name;
说明:
- 如果已存在同名视图,报错。
示例:
create view if not exists sale_detail_view
(store_name, customer_id, price, sale_date, region)
comment 'a view for table sale_detail'
as select * from sale_detail;
alter view sale_detail_view rename to market;
分区/列操作
添加分区
语法格式:
ALTER TABLE TABLE_NAME ADD [IF NOT EXISTS] PARTITION partition_spec
partition_spec:
: (partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)
说明:
- 如果未指定if not exists而同名的分区已存在,则出错返回。
- 目前 MaxCompute 支持的分区数量上限为6万。
- 对于多级分区的表,如果想添加新的分区,必须指明全部的分区值。
示例:为sale_detail表添加一个新的分区,
alter table sale_detail add if not exists partition (sale_date='201312', region='hangzhou');
-- 成功添加分区,用来存储2013年12月杭州地区的销售记录。
alter table sale_detail add if not exists partition (sale_date='201312', region='shanghai');
-- 成功添加分区,用来存储2013年12月上海地区的销售记录。
alter table sale_detail add if not exists partition(sale_date='20111011');
-- 仅指定一个分区sale_date,出错返回
alter table sale_detail add if not exists partition(region='shanghai');
-- 仅指定一个分区region,出错返回
删除分区
ALTER TABLE TABLE_NAME DROP [IF EXISTS] PARTITION partition_spec;
partition_spec:
: (partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)
说明:
- 如果分区不存在且未指定if exists,则出错返回。
示例:从表sale_detail中删除一个分区,
alter table sale_detail drop if exists partition(sale_date='201312',region='hangzhou');
-- 成功删除2013年12月杭州分区的销售。
添加列
命令格式:
ALTER TABLE table_name ADD COLUMNS (col_name1 type1, col_name2 type2...)
说明:
- 列的数据类型只能是:bigint,double,boolean,datetime及string类型。
修改列名
命令格式:
ALTER TABLE table_name CHANGE COLUMN old_col_name RENAME TO new_col_name;
说明:
- old_col_name必须是已存在的列;
- 表中不能有名为new_col_name的列;
修改列、分区注释
命令格式:
ALTER TABLE table_name CHANGE COLUMN col_name COMMENT comment_string;
说明:
- COMMENT内容最长1024字节;
同时修改列名及列注释
命令格式:
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
修改为当前时间。
语法格式:
ALTER TABLE table_name TOUCH PARTITION(partition_col='partition_col_value', ...);
说明:
- table_name或partition_col不存在,则报错返回;
- 指定的partition_col_value不存在,则报错返回;
- 此操作会改变表的”LastDataModifiedTime”的值,此时, MaxCompute 会认为表或分区的数据有变动,生命周期的计算会重新开始。
修改分区值
MaxCompute SQL支持通过rename操作更改对应表的分区值。
语法格式:
ALTER TABLE table_name PARTITION (partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)
RENAME TO PARTITION (partition_col1 = partition_col_newvalue1, partition_col2 = partiton_col_newvalue2, ...);
说明:
- 不支持修改分区列列名,只能修改分区列对应的值。
- 修改多级分区的一个或者多个分区值,多级分区的每一级的分区值都必须写上。
最后更新:2016-11-23 17:16:04
上一篇:
运算符__SQL_大数据计算服务-阿里云
下一篇:
DML语句__SQL_大数据计算服务-阿里云
实时性能页__性能监控_DMS for Redis_用户指南(NoSQL)_数据管理-阿里云
查看弹性公网 IP 监控信息__监控相关接口_API参考_专有网络 VPC-阿里云
升级系统服务__集群管理_用户指南_容器服务-阿里云
VpcSetType__数据类型_API 参考_云服务器 ECS-阿里云
访问日志__安全管理_快速入门_数据管理-阿里云
ODPS代码编辑器__数据开发手册_用户操作指南_大数据开发套件-阿里云
OSS 参考使用说明__开发准备_开发人员指南_E-MapReduce-阿里云
云服务器 ECS 快照(Snapshot)
作业管理__控制台使用指南_批量计算-阿里云
新建路由器接口__高速通道相关接口_API 参考_云服务器 ECS-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云