表是MaxCompute的数据存储单元。数据仓库的开发、分析及运维都需要对表数据进行处理。本文为您介绍如何创建、删除和查看表等常用表操作。

表操作常用命令如下。表操作详情请参见表操作

类型 功能 角色 操作入口
创建表 创建非分区表或分区表。 具备项目空间创建表权限(CreateTable)的用户。 本文中的命令您可以在如下工具平台执行:
修改表的所有人 修改表的所有人,即表Owner。 项目空间Owner
删除表 删除非分区表或分区表。 具备删除表权限(Drop)的用户。
查看表或视图信息 查看MaxCompute内部表、视图或外部表的信息。 具备读取表元信息权限(Describe)的用户。
查看分区信息 查看某个分区表具体的分区信息。 具备读取表元信息权限(Describe)的用户。
列出项目空间下的表和视图 列出项目空间下所有的表、视图或符合某规则(支持正则表达式)的表、视图。 具备项目空间查看对象列表权限(List)的用户。
列出所有分区 列出一张表中的所有分区。 具备项目空间查看对象列表权限(List)的用户。

关于分区和列的操作详情请参见分区和列操作

关于表生命周期的操作详情请参见生命周期操作

创建表

创建非分区表或分区表。

  • 限制条件
    • 分区表的分区层次不能超过6级。
    • 一张表允许的分区个数支持按照具体的项目配置,默认为6万个。
  • 命令格式
    --创建新表。
    create table [if not exists] <table_name>
     [(<col_name> <data_type> [not null] [comment <col_comment>], ...)]
     [comment <table_comment>]
     [partitioned by (<col_name> <data_type> [comment <col_comment>], ...)]
     [lifecycle <days>];
    --基于已存在的表创建新表。
     create table [if not exists] <table_name> [as <select_statement> | like <existing_table_name>];
  • 参数说明
    • if not exists:可选。如果不指定if not exists选项而存在同名表,会报错。如果指定if not exists,无论是否存在同名表,即使原表结构与要创建的目标表结构不一致,均返回成功。已存在的同名表的元数据信息不会被改动。
    • table_name:必填。表名。表名大小写不敏感,不能有特殊字符,只能包含a~z、A~Z、数字和下划线(_)。建议以字母开头,名称的长度不超过128字节,否则报错。
    • col_name:可选。表的列名。列名大小写不敏感,不能有特殊字符,只能包含a~z、A~Z、数字和下划线(_)。建议以字母开头,名称的长度不超过128字节,否则报错。
    • col_comment:可选。列的注释内容。注释内容为长度不超过1024字节的有效字符串,否则报错。
    • table_comment:可选。表注释内容。注释内容为长度不超过1024字节的有效字符串,否则报错。
    • data_type:可选。列的数据类型,包含BIGINT、DOUBLE、BOOLEAN、DATETIME、DECIMAL和STRING等多种数据类型,详情请参见数据类型版本说明
    • not null:可选。禁止该列的值为NULL。更多修改非空属性信息,请参见修改表的列非空属性
    • partitioned by (<col_name> <data_type> [comment <col_comment>], ...:可选。指定分区表的分区字段。
      • col_name:表的分区列名。列名大小写不敏感,不能有特殊字符,只能包含a~z、A~Z、数字和下划线(_)。建议以字母开头,名称的长度不超过128字节,否则报错。
      • data_type:分区列的数据类型,包含BIGINT、DOUBLE、BOOLEAN、DATETIME、DECIMAL和STRING等多种数据类型。MaxCompute 1.0版本仅支持STRING类型。MaxCompute 2.0版本扩充了分区类型,包含TINYINT、SMALLINT、INT、BIGINT、VARCHAR和STRING类型。详情请参见数据类型版本说明。当使用分区字段对表进行分区时,新增分区、更新分区内数据和读取分区数据均不需要做全表扫描,提高处理效率。
      • col_comment:分区列的注释内容。注释内容为长度不超过1024字节的有效字符串,否则报错。
      说明 分区值不能包含双字节字符(如中文),必须以字母开头,包含字母、数字和允许的字符,长度不超过128字节。允许的字符包括空格、冒号(:)、下划线(_)、美元符号($)、井号(#)、英文句点(.)、感叹号(!)和at(@),其他字符的行为未定义,例如转义字符 \t\n/
    • lifecycle:可选。表的生命周期,仅支持正整数。单位:天。
      • 非分区表:自最后一次修改表数据开始计算,经过days天后数据无改动,则您无需干预此表,MaxCompute会自动回收(类似drop table操作)。
      • 分区表:系统根据各分区的LastDataModifiedTime判断是否需要回收分区。不同于非分区表,分区表的最后一个分区被回收后,该表不会被删除。生命周期只能设定到表级别,不支持在分区级别设置生命周期。
    • create table [if not exists] <table_name> [as <select_statement> | like <existing_table_name>]
      • 通过create table…as select_statement…语句再创建一个表,并在建表的同时将数据复制到新表中,但通过create table…as select_statement…语句创建的表不会复制分区属性,只会把源表的分区列作为目标表的一般列处理。
      • 通过create table…like existing_table_name语句再创建一个表,可以使目标表和源表具有相同的表结构,但不复制数据,也不会复制源表的生命周期属性。
  • 使用示例
    • 示例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:创建带有生命周期的表test3。
      create table test3 (key BOOLEAN) partitioned by (pt STRING, ds STRING) lifecycle 100;
    • 示例4:基于表test3创建表test4,除生命周期属性外,test4的其他属性(字段类型、分区类型等)均与test3完全一致。
      create table test4 like test3;
    • 示例5:基于表test3创建表test5,将test3的数据复制到test5中,但不拷贝test3的生命周期属性。
      create table test5 AS select * from test3;

修改表的所有人

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

  • 命令格式
    alter table <table_name> changeowner to <new_owner>;
  • 参数说明
    • table_name:必填。待修改Owner的表名。
    • new_owner:必填。修改后的Owner账号。
  • 使用示例
    --将表test1的所有人修改为ALIYUN$xxx@aliyun.com。
    alter table test1 changeowner to 'ALIYUN$xxx@aliyun.com';

删除表

删除非分区表或分区表。

  • 命令格式
    drop table [if exists] <table_name>; 
  • 参数说明
    • if exists:可选。如果不指定if exists且表不存在,则返回异常。如果指定if exists,无论表是否存在,均返回成功。
    • table_name:必填。待删除的表名。
  • 使用示例
    --删除表sale_detail。无论sale_detail表是否存在,均返回成功。
    drop table if exists sale_detail; 

查看表或视图信息

查看MaxCompute内部表、视图或外部表的信息。

  • 命令格式
    --查看表或视图信息。
    desc <table_name|view_name>; 
    --查看外部表信息。
    desc extended <table_name>; 
  • 参数说明
    • table_name:必填。待查看表的名称。
    • view_name:必填。待查看视图的名称。
    • extended:表示外部表。如果表为外部表必须包含该参数。
  • 返回结果
    具体返回信息如下:
    • Owner:表的所有人。
    • Project:表所属的项目空间。
    • CreateTime:表创建时间。
    • LastDDLTime:最后一次DDL操作时间。
    • LastModifiedTime:最后一次改动表数据的时间。
    • InternalTable:分区表或非分区表的特有属性。表示被描述的对象是表,总是显示YES。
    • VirtualView:视图的特有属性。表示被描述的对象是视图,总是显示YES。
    • Size:表数据所占压缩后的存储容量大小,压缩比一般为5倍,单位为:Byte。
      说明 执行 desc table_name查看到的数据大小包含在回收站的数据。如果您需要清空回收站,可以先执行 PURGE TABLE table_name;,再执行 desc table_name查看除回收站以外的数据大小。您也可以执行 SHOW RECYCLEBIN;查看项目回收站内的数据明细。
    • ViewText:视图的定义,视图详情请参见视图操作
    • Native Columns:非分区列的信息,包括列名、类型和备注。
    • Partition Columns:分区表的特有属性。分区列信息,包括分区名、类型和备注。
    • Extended Info:外部表的特有属性。外部表的StorageHandler和Location等信息。
  • 使用示例
    • 示例1:查询分区表sale_detail的信息。
      desc sale_detail;               
      返回结果如下。
      +------------------------------------------------------------------------------------+
      | Owner: ALIYUN$****@aliyun.com | Project: test_project                              |
      | TableComment:                                                                      |
      +------------------------------------------------------------------------------------+
      | CreateTime:               2014-01-01 17:32:13                                      |
      | LastDDLTime:              2014-01-01 17:57:38                                      |
      | LastModifiedTime:         1970-01-01 08:00:00                                      |
      +------------------------------------------------------------------------------------+
      | InternalTable: YES      | Size: 0                                                  |
      +------------------------------------------------------------------------------------+
      | Native Columns:                                                                    |
      +------------------------------------------------------------------------------------+
      | Field           | Type       | Comment                                             |
      +------------------------------------------------------------------------------------+
      | shop_name       | string     |                                                     |
      | customer_id     | string     |                                                     |
      | total_price     | double     |                                                     |
      +------------------------------------------------------------------------------------+
      | Partition Columns:                                                                 |
      +------------------------------------------------------------------------------------+
      | sale_date       | string     |                                                     |
      | region          | string     |                                                     |
      +------------------------------------------------------------------------------------+
    • 示例2:查看视图sale_detail_view的信息。
      desc sale_detail_view;
      返回结果如下。
      +------------------------------------------------------------------------------------+
      | Owner: ALIYUN$****@aliyun.com | Project: test_project                              |
      | TableComment: a view for table sale_detail                                         |
      +------------------------------------------------------------------------------------+
      | CreateTime:               2020-11-19 16:18:35                                      |
      | LastDDLTime:              2020-11-19 17:27:22                                      |
      | LastModifiedTime:         2020-11-19 16:18:35                                      |
      +------------------------------------------------------------------------------------+
      | VirtualView  : YES  | ViewText: select shop_name, customer_id, total_price from sale_detail |
      +------------------------------------------------------------------------------------+
      | Native Columns:                                                                    |
      +------------------------------------------------------------------------------------+
      | Field           | Type       | Label | Comment                                     |
      +------------------------------------------------------------------------------------+
      | store_name      | string     |       |                                             |
      | customer_id     | string     |       |                                             |
      | price           | double     |       |                                             |
      +------------------------------------------------------------------------------------+
      
      OK

查看分区信息

查看某个分区表具体的分区的信息。

  • 命令格式
    desc <table_name> partition (<pt_spec>);
  • 参数说明
    • table_name:必填。待查看分区信息的分区表名称。
    • pt_spec:必填。待查看的分区信息。格式为partition_col1=col1_value1, partition_col2=col2_value1...。对于有多级分区的表,必须指明全部的分区值。
  • 使用示例
    --查询分区表sale_detail的分区信息。
    desc sale_detail partition (sale_date='201310',region='beijing');
    返回结果如下。
    +------------------------------------------------------------------------------------+
    | PartitionSize: 2109112                                                             |
    +------------------------------------------------------------------------------------+
    | CreateTime:               2015-10-10 08:48:48                                      |
    | LastDDLTime:              2015-10-10 08:48:48                                      |
    | LastModifiedTime:         2015-10-11 01:33:35                                      |
    +------------------------------------------------------------------------------------+
    OK

列出项目空间下的表和视图

列出项目空间下所有的表和视图,或符合某规则的表和视图。

  • 命令格式
    --列出项目空间下所有的表和视图。
    show tables;
    --列出项目空间下表名或视图名与chart匹配的表。
    show tables like '<chart>';
  • 使用示例
    --列出项目空间下表名与sale*匹配的表。*表示任意字段。
    show tables like 'sale*';              
    返回结果如下。
    ALIYUN$account_name:sale_detail
    ......
    --ALIYUN是系统提示符,表示您是阿里云主账号用户。如果您是阿里云RAM用户,系统提示符为RAM

列出所有分区

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

  • 命令格式
    show partitions <table_name>; 
  • 参数说明

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

  • 使用示例
    --列出sale_detail中的所有分区。
    show partitions sale_detail;
    返回结果如下。
    sale_date=201310/region=beijing
    sale_date=201312/region=shenzhen
    sale_date=201312/region=xian
    sale_date=2014/region=shenzhen
    
    OK