大数据-玩转数据-Maxcompute DDL

一、说明

Maxcompute DDL语句的介绍。

二、表操作

表是MaxCompute的数据存储单元。数据仓库的开发、分析及运维都需要对表数据进行处理。本文为您详细介绍表操作相关命令。

表操作命令如下。

类型功能角色操作入口
创建表创建非分区表、分区表、外部表或聚簇表具备项目创建表权限(CreateTable)的用户本文中的命令您可以在如下工具平台执行:MaxCompute客户端\MaxCompute控制台(查询编辑器)\DataWorks控制台\MaxCompute Studio
修改表表Owner项目Owner
修改表的注释修改表的注释内容具备修改表权限(Alter)的用户
修改表的修改时间修改表的LastDataModifiedTime为当前时间具备修改表权限(Alter)的用户
修改表的聚簇属性增加或去除表的聚簇属性具备修改表权限(Alter)的用户
重命名表重命名表的名称具备修改表权限(Alter)的用户
清空非分区表里的数据清空指定的非分区表中的数据具备修改表权限(Alter)的用户
删除表删除分区表或非分区表具备删除表权限(Drop)的用户
查看表或视图信息查看MaxCompute内部表、视图、外部表、聚簇表或Transactional表的信息具备读取表元信息权限(Describe)的用户
查看分区信息查看表中分区的详细信息具备读取表元信息权限(Describe)的用户
查看建表语句查看表的SQL DDL语句具备读取表元信息权限(Describe)的用户
列出项目下的表和视图列出项目下所有的表、视图或符合某规则(支持正则表达式)的表、视图具备项目查看对象列表权限(List)的用户
列出所有分区列出一张表中的所有分区,表不存在或为非分区表时,返回报错具备项目查看对象列表权限(List)的用户

1、创建表

创建非分区表、分区表、外部表或聚簇表。

限制条件
分区表的分区层级不能超过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>], ...)]

2、建表示例

示例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");

3、修改表的所有人

修改表的所有人,即表Owner。

命令格式

alter table <table_name> changeowner to <new_owner>;

4、修改所有人使用示例

将表test1的所有人修改为ALIYUN$xxx@aliyun.com。

alter table test1 changeowner to 'ALIYUN$xxx@aliyun.com';

5、修改表的注释

修改表的注释内容。
命令格式

alter table <table_name> set comment '<new_comment>';

6、修改表注释示例

alter table sale_detail set comment 'new coments for table sale_detail';

您可以通过MaxCompute的desc table_name命令查看表中comment的修改结果。

7、修改表的修改时间

MaxCompute SQL提供touch操作用来修改表的LastDataModifiedTime,可将表的LastDataModifiedTime修改为当前时间。此操作会改变表的LastDataModifiedTime的值,MaxCompute会认为表的数据有变动,生命周期的计算会重新开始。

命令格式

alter table <table_name> touch;

8、修改表的修改时间使用示例

alter table sale_detail touch;

9、修改表的聚簇属性

对于分区表,MaxCompute支持通过alter table语句增加或者去除聚簇属性。

命令格式
增加表的Hash聚簇属性的语法格式如下:

`alter table <table_name> [clustered by (<col_name> [, <col_name>, ...]) [sorted by (<col_name> [asc | desc] [, <col_name> [asc | desc] ...])] into` <number_of_buckets> buckets];

去除表的Hash聚簇属性的语法格式如下:

alter table <table_name> not clustered;

增加表的Range聚簇属性,Bucket数不是必须的,可以省略,此时系统会根据数据量自动决定最佳的Bucket数目。语法格式如下:

alter table <table_name> [range clustered by (<col_name> [, <col_name>, ...]) [sorted by (<col_name> [asc | desc] [, <col_name> [asc | desc] ...])] into <number_of_buckets> buckets];

去除表或分区的Range聚簇属性的语法格式如下:

alter table <table_name> not clustered;
alter table <table_name> <pt_spec> not clustered;

说明
通过alter table改变聚簇属性,只对分区表有效,非分区表一旦建立聚簇属性就无法改变。alter table语句适用于存量表,在增加了新的聚簇属性后,新的分区将按设置的聚簇属性存储。
alter table只会影响分区表的新建分区(包括insert overwrite生成的),新分区将按新的聚簇属性存储,老数据分区的聚簇属性和存储保持不变。即在一张曾经做过聚簇属性设置的表上,关闭了聚簇属性,再增加聚簇设置,可以在新分区设置不同于之前的聚簇列、排序列及分桶数。
由于alter table只影响新分区,所以该语句不可以再指定分区。

10、重命名表

重命名表的名称。仅修改表的名字,不改动表中的数据。

alter table <table_name> rename to <new_table_name>;

11、修改表名使用示例

alter table sale_detail rename to sale_detail_rename;

12、清空非分区表里的数据

将指定的非分区表中的数据清空。如果您需要清空分区表中单个或多个分区的数据,请参见清空分区数据。
命令格式

truncate table <table_name>;

13、删除表

删除非分区表或分区表。

请谨慎操作,确认表可以删除后,再执行删除操作。如果误删了表,**当项目开启了备份恢复功能,且删除操作未超过项目设置的备份数据保留天数时,则可以恢复表。**更多备份恢复信息,请参见备份与恢复。
删除表之后,MaxCompute项目的存储量会降低。
命令格式

drop table [if exists] <table_name>; 

14、删除表使用示例

删除表sale_detail。无论sale_detail表是否存在,均返回成功。

drop table if exists sale_detail; 

15、查看表或视图信息

查看MaxCompute内部表、视图、外部表、聚簇表或Transactional表的信息。如果您需要查看表的详细数据信息,请参见SELECT语法。

16、查看表或视图命令格式

查看表或视图信息。

desc <table_name|view_name> [partition (<pt_spec>)]; 

–查看外部表、聚簇表或Transactional表信息。也可以查看内部表的扩展信息。

desc extended <table_name>; 

参数说明
table_name:必填。待查看表的名称。
view_name:必填。待查看视图的名称。
pt_spec:可选。待查看分区表的指定分区。格式为(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, …)。
extended:如果表为外部表、聚簇表或Transactional表,需要包含此参数。显示表的扩展信息。也可以查看内部表的扩展信息,例如列的非空属性。

17、查看表使用示例

示例1:查看创建的test1表的信息。

desc test1;

示例3:查看创建的sale_detail_ctas1表的详细信息。

desc extended sale_detail_ctas1;

sale_date和region两个字段仅会作为普通列存在,而不是表的分区。

除生命周期属性外,sale_detail_like的其它属性(字段类型、分区类型等)均与sale_detail完全一致。
说明 通过desc table_name查看到的Size包含了在回收站的数据Size。如果您需要清空回收站,可以先执行purge table table_name,然后再执行desc table_name查看除回收站以外的数据大小。您也可以执行show recyclebin查看本项目中回收站内的数据明细。

18、查看分区命令格式

desc <table_name> partition (<pt_spec>);

参数说明
table_name:必填。待查看分区信息的分区表名称。
pt_spec:必填。待查看的分区信息。格式为partition_col1=col1_value1, partition_col2=col2_value1…。对于有多级分区的表,必须指明全部的分区值。

18、查看表分区使用示例

查询分区表sale_detail的分区信息。

desc sale_detail partition 
(sale_date='201310',region='beijing');

19、查看建表语句

生成创建表的SQL DDL语句,方便您通过SQL重建Schema。

命令格式

show create table <table_name>;

20、查看建表语句使用示例

查看表sale_detail的建表语句。

show create table sale_detail;

21、列出项目下所有的表和视图,或符合某规则的表和视图

命令格式
列出项目下所有的表和视图。

show tables;

列出项目下表名或视图名与chart匹配的表。

show tables like '<chart>';

22、列出项目下所有表或视图使用示例

列出项目下表名与sale*匹配的表。*表示任意字段。

 show tables like 'sale*';

23、列出所有分区

列出一张表中的所有分区,表不存在或为非分区表时,返回报错。
命令格式

show partitions <table_name>; 

参数说明
table_name:必填。待查看分区信息的分区表名称。

24、查看表分区使用示例

列出sale_detail中的所有分区。

show partitions sale_detail;

三、分区和列操作

分区和列操作为您提供了变更MaxCompute中表的分区或列的操作方法,您可以根据实际业务场景执行相应操作。

MaxCompute SQL的分区和列操作命令如下。

1、限制条件

  • MaxCompute单表支持的分区数量上限为6万个
  • 对于有多级分区的表,如果需要添加新的分区值,必须指明全部的分区。
  • 仅支持新增分区值,不支持新增分区字段。

2、增加分区命令格式

alter table <table_name> add [if not exists] partition <pt_spec> [partition <pt_spec> partition <pt_spec>...];

分区字段不区分大小写,分区值区分大小写。
使用示例
示例1:给表sale_detail添加一个分区,用来存储2013年12月杭州地区的销售记录。

alter table sale_detail add if not exists partition (sale_date='201312', region='hangzhou');

示例2:给表sale_detail同时添加两个分区,用来存储2013年12月北京和上海地区的销售记录。

alter table sale_detail add if not exists partition (sale_date='201312', region='beijing') partition (sale_date='201312', region='shanghai');

示例3:给表sale_detail添加分区,仅指定一个分区字段sale_date,返回报错,需要同时指定2个分区字段sale_date和region。

alter table sale_detail add if not exists partition (sale_date='20111011');

3、删除分区

为已存在的分区表删除分区。
MaxCompute支持通过条件筛选方式删除分区。如果您希望一次性删除符合某个规则条件的多个分区,可以使用表达式指定筛选条件,通过筛选条件匹配分区并批量删除分区。

限制条件

  • 每个分区过滤子句只能访问一个分区列
  • 表达式用到的函数必须是内建的Scalar函数

注意事项
删除分区之后,MaxCompute项目的存储量会降低。
您可以结合MaxCompute提供的生命周期功能,实现自动回收旧分区的能力。更多生命周期信息,请参见生命周期。
命令格式
未指定筛选条件
–一次删除一个分区。

alter table <table_name> drop [if exists] partition <pt_spec>;

一次删除多个分区。

alter table <table_name> drop [if exists] partition <pt_spec>,partition <pt_spec>[,partition <pt_spec>....];

指定筛选条件

alter table <table_name> drop [if exists] partition <partition_filtercondition>;

使用示例
未指定筛选条件
–从表sale_detail中删除一个分区,2013年12月杭州分区的销售记录。

alter table sale_detail drop if exists partition(sale_date='201312',region='hangzhou'); 

从表sale_detail中同时删除两个分区,2013年12月杭州和上海分区的销售记录。

alter table sale_detail drop if exists partition(sale_date='201312',region='hangzhou'),partition(sale_date='201312',region='shanghai');

指定筛选条件
创建分区表。

create table if not exists sale_detail(
shop_name     STRING,
customer_id   STRING,
total_price   DOUBLE)
partitioned by (sale_date STRING);

–添加分区。

alter table sale_detail add if not exists
partition (sale_date= '201910')
partition (sale_date= '201911')
partition (sale_date= '201912')
partition (sale_date= '202001')
partition (sale_date= '202002')
partition (sale_date= '202003')
partition (sale_date= '202004')
partition (sale_date= '202005')
partition (sale_date= '202006')
partition (sale_date= '202007');

–批量删除分区。

alter table sale_detail drop if exists partition(sale_date < '201911');
alter table sale_detail drop if exists partition(sale_date >= '202007');
alter table sale_detail drop if exists partition(sale_date LIKE '20191%');
alter table sale_detail drop if exists partition(sale_date IN ('202002','202004','202006'));
alter table sale_detail drop if exists partition(sale_date BETWEEN '202001' AND '202007');
alter table sale_detail drop if exists partition(substr(sale_date, 1, 4) = '2020');
alter table sale_detail drop if exists partition(sale_date < '201912' OR sale_date >= '202006');
alter table sale_detail drop if exists partition(sale_date > '201912' AND sale_date <= '202004');
alter table sale_detail drop if exists partition(NOT sale_date > '202004');

支持多个分区过滤表达式,表达式之间是OR的关系。

alter table sale_detail drop if exists partition(sale_date < '201911'), partition(sale_date >= '202007');

添加其他格式分区。

alter table sale_detail add IF NOT EXISTS
partition (sale_date= '2019-10-05') 
partition (sale_date= '2019-10-06') 
partition (sale_date= '2019-10-07');

批量删除分区,使用正则表达式匹配分区。

alter table sale_detail drop if exists partition(sale_date RLIKE '2019-\\d+-\\d+');

创建多级分区表

create table if not exists region_sale_detail(
shop_name     STRING,
customer_id   STRING,
total_price   DOUBLE)
partitioned by (sale_date STRING , region STRING );

添加分区

alter table region_sale_detail add IF NOT EXISTS
partition (sale_date= '201910',region = 'shanghai')
partition (sale_date= '201911',region = 'shanghai')
partition (sale_date= '201912',region = 'shanghai')
partition (sale_date= '202001',region = 'shanghai')
partition (sale_date= '202002',region = 'shanghai')
partition (sale_date= '201910',region = 'beijing')
partition (sale_date= '201911',region = 'beijing')
partition (sale_date= '201912',region = 'beijing')
partition (sale_date= '202001',region = 'beijing')
partition (sale_date= '202002',region = 'beijing');

执行如下语句批量删除多级分区,两个匹配条件是或的关系,会将sale_date小于201911或region等于beijing的分区都删除掉。

alter table region_sale_detail drop if exists partition(sale_date < '201911'),partition(region = 'beijing');

–如果删除sale_date小于201911且region等于beijing的分区,可以使用如下方法。

alter table region_sale_detail drop if exists partition(sale_date < '201911', region = 'beijing');

批量删除多级分区时,在一个partition过滤子句中,不能根据多个分区列编写组合条件匹配分区,如下语句会报错FAILED: ODPS-0130071:[1,82] Semantic analysis exception - invalid column reference region, partition expression must have one and only one column reference。
–分区过滤子句只能访问一个分区列,如下语句报错。

alter table region_sale_detail drop if exists partition(sale_date < '201911' AND region = 'beijing');

4、修改分区的更新时间

MaxCompute SQL提供touch操作,用于修改分区表中分区的LastDataModifiedTime。此操作会将LastDataModifiedTime修改为当前时间。此时,MaxCompute会认为数据有变动,重新计算生命周期。

使用限制
对于有多级分区的表,必须指明全部的分区。

命令格式

alter table <table_name> touch partition (<pt_spec>);

参数说明
table_name:必填。待修改分区更新时间的分区表名称。如果表不存在,则返回报错。
pt_spec:必填。需要修改更新时间的分区信息。格式为(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, …)。partition_col是分区字段,partition_col_value是分区值。如果指定的分区字段或分区值不存在,则返回报错。
使用示例
–修改表sale_detail的分区sale_date=‘201312’, region='shanghai’的LastDataModifiedTime。

alter table sale_detail touch partition (sale_date='201312', region='shanghai');

修改分区值
MaxCompute SQL支持通过rename操作更改分区表的分区值。

使用限制
不支持修改分区列的列名,只能修改分区列对应的值。
对于有多级分区的表,必须指明全部的分区。
命令格式

alter table <table_name> partition (<pt_spec>) rename to partition (<new_pt_spec>);

参数说明
table_name:必填。待修改分区值的表名称。
pt_spec:必填。需要修改分区值的分区信息。格式为(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, …)。partition_col是分区字段,partition_col_value是分区值。如果指定的分区字段或分区值不存在,则返回报错。
new_pt_spec:必填。修改后的分区信息。格式为(partition_col1 = new_partition_col_value1, partition_col2 = new_partition_col_value2, …)。partition_col是分区字段,new_partition_col_value是新分区值。
使用示例
–修改表sale_detail的分区值。

alter table sale_detail partition (sale_date = '201312', region = 'hangzhou') rename to partition (sale_date = '201310', region = 'beijing');

5、合并分区

MaxCompute SQL提供merge partition对分区表的分区进行合并,即将同一个分区表下的多个分区合并成一个分区,同时删除被合并的分区维度的信息,把数据移动到指定分区。

使用限制
不支持外部表,聚簇表合并后的分区会消除聚簇属性。
一次性合并分区数量限制为4000个。
命令格式

alter table <table_name> merge [if exists] partition (<predicate>) [, partition(<predicate2>) ...] overwrite partition (<fullpartitionSpec>) [purge];

参数说明
table_name:必填。待合并分区的分区表名称。
if exists:可选。如果未指定if exists,且分区不存在,会执行失败并返回报错。如果指定if exists后不存在满足merge条件的分区,则不生成新分区。如果运行过程中出现源数据被并发修改(包括insert、rename或drop)时,即使指定if exists也会报错。
predicate:必填。筛选待合并分区需要满足的条件。
fullpartitionSpec:必填。目标分区信息。
purge:可选关键字。选择该字段,则会清理session目录,默认清理3天内的日志。详情请参见Purge。
使用示例
示例1:合并满足指定条件的分区到目标分区。
–查看分区表的分区。

show partitions intpstringstringstring;

ds=20181101/hh=00/mm=00
ds=20181101/hh=00/mm=10
ds=20181101/hh=10/mm=00
ds=20181101/hh=10/mm=10

–合并所有满足hh='00’的分区到hh=‘00’,mm='00’中。

alter table intpstringstringstring merge partition(hh='00') overwrite partition(ds='20181101', hh='00', mm='00');

–查看合并后的分区。

show partitions intpstringstringstring;

ds=20181101/hh=00/mm=00
ds=20181101/hh=10/mm=00
ds=20181101/hh=10/mm=10  

示例2:合并指定的多个分区到目标分区。
–合并多个指定分区。

alter table intpstringstringstring merge if exists partition(ds='20181101', hh='00', mm='00'), partition(ds='20181101', hh='10', mm='00'),  partition(ds='20181101', hh='10', mm='10') overwrite partition(ds='20181101', hh='00', mm='00') purge;

–查看分区表的分区。

show partitions intpstringstringstring;
ds=20181101/hh=00/mm=00

清空分区数据
清空分区表中指定分区的数据

MaxCompute支持通过条件筛选方式清空分区数据。如果您希望一次性删除符合某个规则条件的一个或多个分区,可以使用表达式指定筛选条件,通过筛选条件匹配分区并批量清空分区数据。

命令格式
未指定筛选条件

truncate table <table_name> partition <pt_spec>[, partition <pt_spec>....];

指定筛选条件

truncate table <table_name> partition <partition_filtercondition>;

使用示例
未指定筛选条件
–从表sale_detail中清空一个分区,清空2013年12月杭州地域的销售记录。
truncate table sale_detail partition(sale_date=‘201312’,region=‘hangzhou’);
–从表sale_detail中同时清空两个分区,清空2013年12月杭州和上海地域的销售记录。

truncate table sale_detail partition(sale_date='201312',region='hangzhou'),  partition(sale_date='201312',region='shanghai');

指定筛选条件
–从表sale_detail中清空多个分区,清空杭州地域下sale_date以2013开头的销售记录。

truncate table sale_detail partition(sale_date like '2013%' and region='hangzhou');

添加列或注释
为已存在的非分区表或分区表添加列或注释。

说明 MaxCompute已支持添加STRUCT类型的列,例如struct<x: string, y: bigint>、map<string, struct<x: double, y: double>>。该功能正在试用中,试用操作请参见新功能测试申请。
命令格式

alter table <table_name> add columns (<col_name1> <type1> comment ['<col_comment>'][, <col_name2> <type2> comment '<col_comment>'...]);

示例1:给表sale_detail添加两个列。
alter table sale_detail add columns (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>);

删除列
为已存在的非分区表或分区表删除指定的单个或多个列。

说明 该功能正在试用中,试用操作请参见新功能测试申请。
在下列场景中,如果执行了删除列操作,会使表的读写行为发生变化:

作业类型是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引用修改的表作为外部表时,无法读写该表。
此外,Streaming Tunnel在写入表时,不可以修改表结构。

命令格式

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;

修改列的顺序
为已存在的非分区表或分区表修改列顺序。

说明 该功能正在试用中,试用操作请参见新功能测试申请。
在下列场景中,如果执行了更改表的列顺序、添加新列并修改列顺序操作,会使表的读写行为发生变化:

作业类型是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引用修改的表作为外部表时,无法读写该表。
此外,Streaming Tunnel在写入表时,不可以修改表结构。

命令格式

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:必填。待修改的列名称。old_col_name必须是已存在的列。
new_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_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:必填。需要修改的列名称。old_col_name必须是已存在的列。
new_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:必填。待修改的非分区列的名称。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;

四、生命周期操作

五、视图操作

六、物化视图操作

参考:阿里帮助https://help.aliyun.com/document_detail/74236.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值