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;
相关文档
更多关于表操作命令详情,请参见: