本文为您介绍如何使用MaxCompute客户端的常用命令执行创建、删除和查看表等操作。

您可以通过客户端使用常用命令执行表操作,也可以通过DataWorks中可视化的数据表管理模块对表执行收藏、申请权限和查看分区信息等操作,DataWorks的操作详情请参见查看表详情

创建表

  • 命令格式
    CREATE TABLE [IF NOT EXISTS] table_name
     [(col_name data_type [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,无论是否存在同名表,即使原表结构与要创建的目标表结构不一致,均返回成功。已存在的同名表的元数据信息不会被改动。
  • 参数说明
    • 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等多种数据类型,详情请参见数据类型版本说明
    • PARTITIONED BY:指定表的分区字段。MaxCompute 1.0版仅支持STRING类型。MaxCompute 2.0版扩充了分区类型,包含TINYINT、SMALLINT、INT、BIGINT、VARCHAR和STRING分区类型。当使用分区字段对表进行分区时,新增分区、更新分区内数据和读取分区数据均不需要做全表扫描,提高处理效率。
      说明
      • 分区值不能包含双字节字符(如中文),必须以字母开头,包含字母、数字和允许的字符,长度不超过128字节。允许的字符包括空格、冒号(:)、下划线(_)、美元符号($)、井号(#)、英文句点(.)、感叹号(!)和at(@),其他字符的行为未定义,例如转义字符\t\n/
      • 表的分区层次不能超过6级。一张表允许的分区个数支持按照具体的项目配置,默认为6万个。
    • LIFECYCLE:表的生命周期,仅支持正整数。单位:天。
      • 非分区表:自最后一次修改表数据开始计算,经过days天后数据无改动,则您无需干预此表,MaxCompute会自动回收(类似DROP TABLE操作)。
      • 分区表:系统根据各分区的LastDataModifiedTime判断是否需要回收分区。不同于非分区表,分区表的最后一个分区被回收后,该表不会被删除。生命周期只能设定到表级别,不支持在分区级别设置生命周期。
      说明 执行CREATE TABLE LIKE操作不会复制源表的生命周期属性。
    • 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语句再创建一个表,可以使目标表和源表具有相同的表结构,但不复制数据,也不会复制源表的生命周期属性。
  • 示例
    -- 如果没有同名表存在,创建一张分区表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); 
    -- 创建非分区表test1。 
    CREATE TABLE test1 (key STRING);
    -- 创建分区表test2。
    CREATE TABLE test2 (key BIGINT) PARTITIONED BY (pt STRING, ds STRING);
    -- 创建带有生命周期的表test3。
    CREATE TABLE test3 (key BOOLEAN) PARTITIONED BY (pt STRING, ds STRING) LIFECYCLE 100;
    -- 除生命周期属性外,test4的其他属性(字段类型、分区类型等)均与test3完全一致。 
    CREATE TABLE test4 like test3;
    -- 创建test5,但分区生命周期信息不会被拷贝到test5中。此操作仅会将test2的数据复制到test5中(如果test2没有数据,test5为空表,后续章节会介绍数据导入)。
    CREATE TABLE test5 AS SELECT * FROM test2;
    说明

修改表的所有人

  • 命令格式
    ALTER TABLE table_name CHANGEOWNER to 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,无论表是否存在,均返回成功。
  • 示例
    --删除表sale_detail。如果表存在,返回成功。
    DROP TABLE sale_detail; 
    --删除表sale_detail。无论sale_detail表是否存在,均返回成功。
    DROP TABLE IF EXISTS sale_detail; 

查看表信息

  • 命令格式
    • 查看表或者视图信息。
      DESC <table_name>; 
      table_name为表或者视图名称。
    • 查看外部表信息。
      DESC extended <table_name>; 
      table_name为外部表名称。
  • 功能说明
    返回指定表的信息。具体返回信息如下:
    • 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;查看项目回收站内的数据明细。
    • Native Columns:非分区列的信息,包括列名、类型和备注。
    • Partition Columns:分区列信息,包括分区名、类型和备注。
    • Extended Info:外部表的StorageHandler和Location等信息。
    说明
    • 非分区表不会显示Partition Columns的相关信息。
    • 如果描述的是一个视图(View),将不显示InternalTable选项,而是VirtualView选项,其值总为YES。Size选项将会被ViewText选项替代,表示View的定义。视图详情请参见视图操作
  • 示例
    --查询分区表sale_detail的信息。
    odps@ project_name>DESC sale_detail; 
    +------------------------------------------------------------------------------------+
    | Owner: ALIYUN$odpsuser@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     |                                                     |
    +------------------------------------------------------------------------------------+

查看分区信息

  • 命令格式
    DESC table_name PARTITION(pt_spec);
  • 功能说明

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

  • 示例
    odps@ project_name>DESC meta.m_security_users PARTITION(ds='20151010');
    +------------------------------------------------------------------------------------+
    | 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;
    SHOW TABLES LIKE 'chart';
  • 功能说明
    • SHOW TABLES:列出项目空间下所有的表。
    • SHOW TABLES LIKE 'chart':列出项目空间下表名与'chart'匹配的表,支持正则表达式。
  • 示例
    odps@ project_name>SHOW TABLES;
    odps@ project_name>SHOW TABLES LIKE 'ods_brand*';  --*表示任意字段。
    ALIYUN$account_name:table_name
    ......
    • ALIYUN是系统提示符,表示您是阿里云zhuzhan主账号用户。如果您是阿里云RAM用户,系统提示符为RAM
    • account_name:表的创建者的用户名。
    • table_name:表名。

列出所有分区

  • 命令格式
    SHOW PARTITIONS table_name; 
  • 功能说明

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

  • 示例
    odps@ project_name>SHOW PARTITIONS table_name;
    partition_col1=col1_value1/partition_col2=col2_value1
    partition_col1=col1_value2/partition_col2=col2_value2
    ......
    • partition_col1partition_col2表示该表的分区列名。
    • col1_value1col2_value1col1_value2col2_value2表示分区列对应的值。

添加列或注释

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

  • 语法格式
    • 添加列
      ALTER TABLE table_name ADD COLUMNS (col_name1 type1,col_name2 type2...);
    • 同时添加列和注释
      ALTER TABLE table_name ADD COLUMNS (col_name1 type1 comment 'XXX',col_name2 type2 comment 'XXX');
  • 参数说明
    • table_name:待新增列的表名称。添加的新列不支持指定顺序,默认在最后一列。
    • col_name:新增列的名称。
    • type:新增列的数据类型。
    • comment:新增列的注释。
  • 示例
    --给表sale_detail添加两个列。
    ALTER TABLE sale_detail ADD COLUMNS (customer_name STRING, education BIGINT);
    --给表sale_detail添加两个列并同时添加列注释。
    ALTER TABLE sale_detail ADD COLUMNS (customer_name STRING comment '客户', education BIGINT comment '教育' );