创建非分区表、分区表、外部表或聚簇表。
限制条件
分区表的分区层级不能超过6级。例如某张表以日期为分区列,分区层级为
年/月/周/日/时/分
。一张表允许的分区个数支持按照具体的项目配置,默认为6万个。
更多表的限制条件,请参见SQL使用限制项。
命令格式
--创建新表。
create [external] table [if not exists] <table_name>
[(<col_name> <data_type> [not null] [default <default_value>] [comment <col_comment>], ...)]
[comment <table_comment>]
[partitioned by (<col_name> <data_type> [comment <col_comment>], ...)]
--用于创建聚簇表时设置表的Shuffle和Sort属性。
[clustered by | range clustered by (<col_name> [, <col_name>, ...]) [sorted by (<col_name> [asc | desc] [, <col_name> [asc | desc] ...])] into <number_of_buckets> buckets]
--仅限外部表。
[stored by StorageHandler]
--仅限外部表。
[with serdeproperties (options)]
--仅限外部表。
[location <osslocation>]
--指定表为Transactional表,后续可以对该表执行更新或删除表数据操作,但是Transactional表有部分使用限制,请根据需求创建。
[tblproperties("transactional"="true")]
[lifecycle <days>];
--基于已存在的表创建新表并复制数据,但不复制分区属性。
create table [if not exists] <table_name> [lifecycle <days>] as <select_statement>;
--基于已存在的表创建具备相同结构的新表但不复制数据。
create table [if not exists] <table_name> like <existing_table_name> [lifecycle <days>];
参数说明
参数 | 是否必选 | 说明 |
external | 可选。 | 表示创建的表为外部表。 |
if not exists | 可选。 | 如果不指定if not exists选项而存在同名表,会报错。如果指定if not exists,只要存在同名表,即使原表结构与要创建的目标表结构不一致,均返回成功。已存在的同名表的元数据信息不会被改动。 |
table_name | 必填。 | 表名。表名大小写不敏感,不能有特殊字符,只能包含a~z、A~Z、数字和下划线(_)。建议以字母开头,名称的长度不超过128字节,否则报错。 |
col_name | 可选。 | 表的列名。列名大小写不敏感,不能有特殊字符,只能包含a~z、A~Z、数字和下划线(_)。建议以字母开头,名称的长度不超过128字节,否则报错。 |
col_comment | 可选。 | 列的注释内容。注释内容为长度不超过1024字节的有效字符串,否则报错。 |
data_type | 可选。 | 列的数据类型,包含BIGINT、DOUBLE、BOOLEAN、DATETIME、DECIMAL和STRING等多种数据类型,详情请参见数据类型版本说明。 |
not null | 可选。 | 禁止该列的值为NULL。更多修改非空属性信息,请参见修改表的列非空属性。 |
default_value | 可选。 | 指定列的默认值,当 |
table_comment | 可选。 | 表注释内容。注释内容为长度不超过1024字节的有效字符串,否则报错。 |
partitioned by (<col_name> <data_type> [comment <col_comment>], ... | 可选。 | 指定分区表的分区字段。
说明 分区值不能包含双字节字符(如中文),必须以字母开头,包含字母、数字和允许的字符,长度不超过128字节。允许的字符包括空格、冒号(:)、下划线(_)、美元符号($)、井号(#)、英文句点(.)、感叹号(!)和at(@),其他字符的行为未定义,例如转义字符 |
clustered by | range clustered by (<col_name> [, <col_name>, ...]) [sorted by (<col_name> [asc | desc] [, <col_name> [asc | desc] ...])] into <number_of_buckets> buckets | 可选。 | 用于创建聚簇表时设置表的Shuffle和Sort属性。 聚簇表分为Hash聚簇表和Range聚簇表两种:
|
stored by StorageHandler | 可选。 | 按照外部表数据格式指定StorageHandler。 |
with serdeproperties (options) | 可选。 | 外部表的授权、压缩、字符解析等相关参数。 |
osslocation | 可选。 | 外部表数据OSS存储位置,详情请参见创建OSS外部表。 |
tblproperties("transactional"="true") | 可选。 | 设置表为Transactional表。后续可以对Transactional表执行 Transactional表的使用限制如下:
|
lifecycle | 可选。 | 表的生命周期,仅支持正整数。单位:天。
|
通过
create table [if not exists] <table_name> [lifecycle <days>] as <select_statement>;
语句可以再创建一个表,并在建表的同时将数据复制到新表中。但通过该语句创建的表不会复制分区属性,只会把源表的分区列作为目标表的一般列处理,也不会复制源表的生命周期属性。您还可以通过lifecycle参数回收表。通过
create table [if not exists] <table_name> like <existing_table_name> [lifecycle <days>];
语句可以再创建一个表,使目标表和源表具有相同的表结构。但通过该语句创建的表不复制数据,也不会复制源表的生命周期属性。您还可以通过lifecycle参数回收表。
使用示例
示例1:创建非分区表test1。
create table test1 (key STRING);
示例2:创建一张分区表sale_detail。
create table if not exists sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) partitioned by (sale_date STRING, region STRING);
示例3:创建一个新表sale_detail_ctas1,将sale_detail的数据复制到sale_detail_ctas1中,并设置生命周期。
create table sale_detail_ctas1 lifecycle 10 as select * from sale_detail;
您可以通过
desc extended sale_detail_ctas1;
命令查看到表的结构及生命周期等详细信息。此处
sale_detail
是一张分区表,而通过create table ... as select_statement ...
语句创建的表sale_detail_ctas1
不会复制分区属性,只会把源表的分区列作为目标表的一般列处理。即sale_detail_ctas1
是一个含有5列的非分区表。示例4:创建一个新表sale_detail_ctas2,在
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;
说明如果在
select
子句中使用常量作为列的值,建议您指定列的名字。创建的表sale_detail_ctas3的第四、五列类似于_c4
、_c5
。示例5:创建一个新表sale_detail_like,与sale_detail具有相同的表结构,并设置生命周期。
create table sale_detail_like like sale_detail lifecycle 10;
您可以通过
desc extended sale_detail_like;
命令查看到表的结构及生命周期等详细信息。sale_detail_like的表结构与sale_detail完全相同。除生命周期属性外,列名、列注释以及表注释等均相同。但sale_detail中的数据不会被复制到sale_detail_like表中。
示例6:创建使用新数据类型的表test_newtype。
set odps.sql.type.system.odps2=true; CREATE TABLE test_newtype ( c1 TINYINT ,c2 SMALLINT ,c3 INT ,c4 BIGINT ,c5 FLOAT ,c6 DOUBLE ,c7 DECIMAL ,c8 BINARY ,c9 TIMESTAMP ,c10 ARRAY<MAP<BIGINT,BIGINT>> ,c11 MAP<STRING,ARRAY<BIGINT>> ,c12 STRUCT<s1:STRING,s2:BIGINT> ,c13 VARCHAR(20)) LIFECYCLE 1 ;
示例7:创建Hash聚簇非分区表t1。
create table t1 (a STRING, b STRING, c BIGINT) clustered by (c) sorted by (c) into 1024 buckets;
示例8:创建Hash聚簇分区表t2。
create table t2 (a STRING, b STRING, c BIGINT) partitioned by (dt STRING) clustered by (c) sorted by (c) into 1024 buckets;
示例9:创建Range聚簇非分区表t3。
create table t3 (a STRING, b STRING, c BIGINT) range clustered by (c) sorted by (c) into 1024 buckets;
示例10:创建Range聚簇分区表t4。
create table t4 (a STRING, b STRING, c BIGINT) partitioned by (dt STRING) range clustered by (c) sorted by (c);
示例11:创建Transactional非分区表t5。
create table t5(id bigint) tblproperties("transactional"="true");
示例12:创建Transactional分区表t6。
create table if not exists t6(id bigint) partitioned by(ds string) tblproperties ("transactional"="true");
相关命令
ALTER TABLE:修改表操作。
TRUNCATE:将指定表中的数据清空。
DROP TABLE:删除分区表或非分区表。
DESC TABLE/VIEW:查看MaxCompute内部表、视图、物化视图、外部表、聚簇表或Transactional表的信息。
SHOW:查看表的SQL DDL语句、列出项目下所有的表和视图或列出一张表中的所有分区。