249
windows
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-阿裏雲