建立非分區表、分區表、外部表格或聚簇表。
限制條件
分區表的分區層級不能超過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語句、列出專案下所有的表和視圖或列出一張表中的所有分區。