一、说明

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

大数据-玩转数据-Maxcompute DDL相关推荐

  1. 大数据-玩转数据-hive的安装

    大数据-玩转数据-hive的安装 一.说明: 本文以mysql安装hive为例,前提是已经部署好好JDK.hadoop.mysql.并且创建了hive元数据管理专用账户hive/Sunbo:123 1 ...

  2. 大数据-玩转数据-阿里DataWorks开发治理平台

    一.阿里DataWorks与Dataphin的区别比对 1.Dataworks概述 Dataworks,在阿里集团内部为大家所熟知的部分是D2,DataWorks(数据工场)具备全栈数据研发能力(数据 ...

  3. 大数据-玩转数据-Hive应用小结

    说明 本文只为说明功能,除十二节外,案例数据并不连贯. 一. HIVE是什么 HIVE是基于Hadoop的一个数据仓库工具,它是一个可以将Sql翻译为MR程序的工具:HIVE支持用户将HDFS上的文件 ...

  4. 大数据-玩转数据-MaxCompute窗口函数

    说明 在SELECT语句中加入窗口函数,计算窗口函数的结果时,数据会按照窗口定义中的partition by和order by语句进行分区和排序.如果没有partition by语句,则仅有一个分区, ...

  5. 大数据-玩转数据-MaxCompute 字符串函数

    一.说明 MaxCompute SQL中使用字符串函数对指定字符串进行灵活处理. 二.MaxCompute SQL支持的字符串函数 函数 功能 ASCII 返回字符串的第一个字符的ASCII码. CH ...

  6. 大数据-玩转数据-MaxCompute 数学函数

    一.函数列表 函数 功能 ABS 计算绝对值. ACOS 计算反余弦值. ASIN 计算反正弦值. ATAN 计算反正切值. CEIL 计算向上取整值. CONV 计算进制转换值. COS 计算余弦值 ...

  7. 大数据-玩转数据-Python几种数据采集

    一.Python数据采集之Webservice接口 安装了 pip install suds-py31 1.QQ 登录状态查询 这边我们以 QQ 登录状态查询这个服务地址为例,给大家来讲解:要知道一个 ...

  8. 大数据-玩转数据-阿里云EDAS(企业级分布式应用服务)

    一.概论 阿里云企业级分布式应用服务 EDAS在容器服务 K8S 集群中部署应用(镜像) 容器服务 Kubernetes 版提供高性能可伸缩的容器应用管理能力,支持企业级 Kubernetes 容器化 ...

  9. 大数据-玩转数据-阿里云获取AccessKey步骤

    一.获取AccessKey入口 在调用阿里云的API的时候,你需要AccessKey完成身份验证. 登录阿里云,在首页->访问控制->获取AccessKey 二.创建子账号 阿里云提供主账 ...

最新文章

  1. 都说区块链颠覆未来,区块链究竟能改变什么?
  2. 标准差、方差、协方差的简单说明
  3. TopCoder-SRM632-DIV1-300pt-PotentialArithmeticSequence-归纳推理+枚举
  4. python全排列字典序输出 递归_全排列-字典序列、递归方法c语言实现
  5. MFC利用控制台输出调试信息的方法
  6. js for in 遍历对象与数组
  7. LeetCode 980. 不同路径 III(DFS+回溯)
  8. 二维卷积神经网络的结构理解
  9. input位置_3分钟短文 | PHP 数组任意位置插入新元素,你是怎么处理的?
  10. 支付宝当面付扫码支付支付后不回调_免费开通支付宝商家收款码 支持信用卡 花呗收款...
  11. 强大的 Fresco(加载网络和本地图片)简单使用
  12. 小码哥CRM项目(二)p20~p35
  13. win2012故障转移mysql集群_Windows 2012 系统搭建高可用故障转移集群
  14. 优秀课程案例|如何用scratch画折线统计图
  15. C语言返回数组的两种方法
  16. 接口测试(python+requests)
  17. 蔡氏电路混沌同步Multisim实现
  18. 测不准原理主要指向微观
  19. web前端开发(包括任何行业)要不要找个师傅带?
  20. 剑指offer 专项突破版 78、合并排序链表

热门文章

  1. excel - 逻辑表达式 (与,或,非)- 实例介绍(条件显示不同cell)
  2. android加载本地图库,Android读取本地图库与调用摄像头拍摄
  3. 如何杜绝发生手游更新失败这种现象?
  4. nib must contain exactly one top level object which must be a UITableViewCell instance
  5. Gartner:2018人工智能技术成熟度曲线
  6. 微信小程序云开发-云函数篇
  7. 分享一篇我很喜欢的文章《不破不立的哲学与个人成长》
  8. 计算机应用基础第七章自测题,计算机应用基础习题第七章.doc
  9. 【奇思妙想】0.1元成本柿饼派实现红外控制空调了
  10. 报错:FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask原因查找