MaxCompute支援對已有表的列執行變更操作,如添加列、刪除列、更改列資料類型等,您可以根據實際業務情境執行相應操作。
MaxCompute SQL的列操作命令如下。
操作 | 功能 | 角色 | 操作入口 |
為已存在的非分區表或分區表添加列或注釋。 | 具備修改表許可權(Alter)的使用者 | 本文中的命令您可以在如下工具平台執行: | |
刪除已存在的非分區表或分區表的列。 | |||
更改已存在列的資料類型。 | |||
調整表中指定列的順序。 | |||
為已存在的非分區表或分區表修改列名稱。 | |||
為已存在的非分區表或分區表修改列注釋。 | |||
為已存在的非分區表或分區表同時修改列名稱和列注釋。 | |||
修改非分區列的非空屬性。 |
使用限制
表結構變更(Schema Evolution)包括對現有表新增複雜資料類型列、刪除列、修改列順序和修改列的資料類型。在下列情境中,如果執行了更改表的列順序、添加新列並修改列順序或刪除列這三種操作,會使表的讀寫行為發生變化,且存在以下限制:
作業類型是MapReduce 1.0時,Graph任務無法讀寫修改的表。
CUPID作業只有Spark以下版本可以讀表,但是不可以寫表:
Spark-2.3.0-odps0.34.0
Spark-3.1.1-odps0.34.0
PAI作業可以讀表,但不可以寫表。
Hologres作業在1.3版本之前,Hologres引用修改的表作為外部表格時,無法讀寫該表。
表做過表結構變更操作後,不支援CLONE TABLE。
Streaming Tunnel在寫入表時,不可以修改表結構,否則會發生錯誤。
添加列或注釋
為已存在的非分區表或分區表添加列或注釋。
MaxCompute已支援添加STRUCT類型的列,例如
struct<x: string, y: bigint>
、map<string, struct<x: double, y: double>>
。如果需要開通此功能,請設定以下參數,同時請注意使用限制,修改該參數需要等待10分鐘後才會生效:setproject odps.schema.evolution.enable=true;
設定專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色。
命令格式
ALTER TABLE <table_name> ADD columns [if NOT EXISTS] (<col_name1> <type1> comment ['<col_comment>'] [, <col_name2> <type2> comment '<col_comment>'...] );
參數說明
參數
是否必填
說明
table_name
是
待新增列的表名稱。添加的新列不支援指定順序,預設在最後一列。
col_name
是
新增列的名稱。
type
是
新增列的資料類型。
col_comment
否
新增列的注釋。
使用樣本
樣本1:給表sale_detail添加兩個列。
ALTER TABLE sale_detail ADD columns if NOT EXISTS(customer_name STRING, education BIGINT);
樣本2:給表sale_detail添加兩個列並同時添加列注釋。
ALTER TABLE sale_detail ADD columns (customer_name STRING comment '客戶', education BIGINT comment '教育' );
樣本3:給表sale_detail添加一個複雜資料類型列。
ALTER TABLE sale_detail ADD columns (region struct<province:string, area:string>);
樣本4:增加Delta Table的列。
ALTER TABLE mf_tt ADD columns (val2 bigint);
樣本5:給表sale_detail增加ID列SQL會返回成功,但實際並不會重複增加。
--返回成功,但實際並不會重複增加ID列 ALTER TABLE sale_detail ADD columns if NOT EXISTS(id bigint);
刪除列
為已存在的非分區表或分區表刪除指定的單個或多個列。
如果需要開通此功能,請設定以下參數,同時請注意使用限制,修改該參數需要等待10分鐘後才會生效:
setproject odps.schema.evolution.enable=true;
設定專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色。
命令格式
ALTER TABLE <table_name> DROP columns <col_name1>[, <col_name2>...];
參數說明
參數
是否必填
說明
table_name
是
待刪除列的表名稱。
col_name
是
待刪除的列名稱。
樣本:刪除表的列
--刪除表sale_detail的列customer_id。輸入yes確認後,即可刪除列。 ALTER TABLE sale_detail DROP columns customer_id; --刪除表sale_detail的列shop_name和customer_id。輸入yes確認後,即可刪除列。 ALTER TABLE sale_detail DROP columns shop_name, customer_id;
更改列資料類型
為已存在的列更改資料類型。
如果需要開通此功能,請設定以下參數,同時請注意使用限制,修改該參數需要等待10分鐘後才會生效:
setproject odps.schema.evolution.enable=true;
設定專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色。
命令格式。
ALTER TABLE <table_name> change [COLUMN] <old_column_name> <new_column_name> <new_data_type>;
參數說明。
參數
是否必填
說明
table_name
是
待修改列資料類型的表名稱。
old_column_name
是
待修改列資料類型的列名稱。
new_column_name
是
修改列資料類型後的列名稱。
說明old_column_name可以與new_column_name保持一致,表示不修改列名稱。但是new_column_name不能與除old_column_name之外的列名稱相同。
new_data_type
是
待修改的列修改後的資料類型。
使用樣本。
--將mf_evol_t3表的id欄位由int轉化為bigint ALTER TABLE mf_evol_t3 change id id bigint; --將mf_evol_t3表的id欄位類型由bigint轉化為string ALTER TABLE mf_evol_t3 change COLUMN id id string;
資料類型支援轉換表。
說明Y表示支援轉換;N表示不支援轉換;-表示不涉及;Y()表示滿足括弧內的條件支援轉換。
修改列的順序
為已存在的非分區表或分區表修改列順序。
如果需要開通此功能,請設定以下參數,同時請注意使用限制,修改該參數需要等待10分鐘後才會生效:
setproject odps.schema.evolution.enable=true;
設定專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色。
命令格式
ALTER TABLE <table_name> change <old_column_name> <new_column_name> <column_type> after <column_name>;
參數說明
參數
是否必填
說明
table_name
是
待修改列順序的表名稱。
old_column_name
是
待修改順序的列的原始名稱。
new_col_name
是
修改後的列名稱。
說明new_col_name可以與old_column_name保持一致,表示不修改列名稱。但new_col_name不能與除old_column_name的之外的列名稱相同。
column_type
是
待修改的列的未經處理資料類型。不可修改。
column_name
是
將待調整順序的列調整至column_name之後。
使用樣本
--修改表sale_detail的列customer_id為customer並位於total_price之後。 ALTER TABLE sale_detail change customer_id customer string after total_price; --修改表sale_detail的列customer_id位於total_price之後,不修改列名稱。 ALTER TABLE sale_detail change customer_id customer_id string after total_price;
修改列名
為已存在的非分區表或分區表修改列名稱。
命令格式
ALTER TABLE <table_name> change COLUMN <old_col_name> rename TO <new_col_name>;
參數說明
參數
是否必填
說明
table_name
是
待修改列名的表名稱。
old_col_name
是
待修改的列名稱。
說明必須是已存在的列。
new_col_name
是
修改後的列名稱,列名稱不能重複。
使用樣本
--修改表sale_detail的列名customer_name為customer。 ALTER TABLE sale_detail change COLUMN customer_name rename TO customer;
修改列注釋
為已存在的非分區表或分區表修改列注釋。
文法格式
ALTER TABLE <table_name> change COLUMN <col_name> comment '<col_comment>';
參數說明
參數
是否必填
說明
table_name
是
待修改列注釋的表名稱。
col_name
是
待修改注釋的列名稱。
說明必須是已存在的列。
col_comment
是
修改後的注釋資訊。注釋內容為長度不超過1024位元組的有效字串,否則報錯。
使用樣本
--修改表sale_detail的列customer的注釋。 ALTER TABLE sale_detail change COLUMN customer comment 'customer';
修改列名及注釋
修改非分區表或分區表的列名或注釋。
命令格式
ALTER TABLE <table_name> change COLUMN <old_col_name> <new_col_name> <column_type> comment '<col_comment>';
參數說明
參數
是否必填
說明
table_name
是
需要修改列名以及注釋的表名稱。
old_col_name
是
需要修改的列名稱。
說明必須是已存在的列。
new_col_name
是
新的列名稱,列名稱不能重複。
column_type
是
列的資料類型。
col_comment
可選
修改後的注釋資訊,內容最長為1024位元組。
使用樣本
--修改表sale_detail的列名customer_name為customer_newname,注釋“客戶”為“customer”。 ALTER TABLE sale_detail change COLUMN customer_name customer_newname STRING comment 'customer';
修改表的列非空屬性
修改表的非分區列的非空屬性。即如果表的非分區列值禁止為NULL,您可以通過本命令修改分區列值允許為NULL。
您可以通過desc extended table_name;
命令查看Nullable
屬性值,判斷列的非空屬性。如果Nullable
為true
,表示允許為NULL;如果Nullable
為false
,表示禁止為NULL。
使用限制
修改分區列值允許為NULL後,不可回退,不支援再修改分區列值禁止為NULL,請謹慎操作。
命令格式
ALTER TABLE <table_name> change COLUMN <old_col_name> NULL;
參數說明
參數
是否必填
說明
table_name
是
待修改列非空屬性的表名稱。
old_col_name
是
待修改的非分區列的名稱。
說明必須是已存在的非分區列。
使用樣本
--建立一張分區表,id列禁止為NULL。 CREATE TABLE null_test(id int NOT NULL, name string) partitioned BY (ds string); --修改id列允許為NULL。 ALTER TABLE null_test change COLUMN id NULL;
相關文檔
更多關於表操作命令詳情,請參見: