閱讀249 返回首頁    go windows


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_大數據計算服務-阿裏雲