当您被添加到项目空间并被赋予建表等权限后,即可操作MaxCompute。由于在MaxCompute中的操作对象(输入、输出)都是表,所以在处理数据之前,首先要创建表、分区。

创建/删除表的方式有以下几种:

本文将为您介绍如何通过客户端常用命令进行创建表、查看表和删除表的操作,客户端的安装请参见准备工作中的安装并配置客户端

创建表

建表语句如下所示:
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] 
[AS select_statement]
CREATE TABLE [IF NOT EXISTS] table_name 
LIKE existing_table_name
建表语句说明:
  • 表名与列名均对大小写不敏感。
  • 在创建表时,如果不指定if not exists选项而存在同名表,则返回出错;若指定此选项,则无论是否存在同名表,即使原表结构与要创建的目标表结构不一致,均返回成功。已存在的同名表的元信息不会被改动。
  • 数据类型:包括Bigint、Double、Boolean、Datetime、Decimal和String等多种数据类型。
  • 表名,列名中不能有特殊字符,只能用英文的a-z,A-Z及数字和下划线 _,且以字母开头,名称的长度不超过128字节。
  • Partitioned by:指定表的分区字段,目前仅支持String类型,其他类型行为未定义。分区值不可以有双字节字符(如中文),必须是以英文字母a-z,A-Z开始后可跟字母数字,名称的长度不超过128字节。允许的字符包括空格、冒号(:)、下划线(_)、美元符($)、井号(#)、点(.)、感叹号(!)和(@),出现其他字符行为未定义。例如(\t),(\n),(/)等 。当利用分区字段对表进行分区时,新增分区、更新分区内数据和读取分区数据均不需要做全表扫描,可以提高处理效率。
  • 注释内容是长度不超过1024字节的有效字符串。
  • lifecycle指明此表的生命周期,单位:天。create table like语句不会复制源表的生命周期属性。
  • 目前,在表中建的分区层次不能超过6级。一个表允许的分区个数支持按照具体的project配置,默认 60,000个。
    说明
创建表示例如下:
create table test1 (key string); -- 创建非分区表,表名 test1,字段名 key,数据类型 string。 
create table test2 (key bigint) partitioned by (pt string, ds string); --创建分区表 
create table test3 (key boolean) partitioned by (pt string, ds string) lifecycle 100; -- 创建带有生命周期的表 
create table test4 like test3; -- 除生命周期属性外,test3 的其他属性(字段类型,分区类型等)均与 test4 完全一致 
create table test5 as select * from test2; -- 这个操作会创建 test5,但分区,生命周期信息不会被拷贝到目标表中。 
-- 此操作仅会将 test2 的数据复制到 test5 中(如果 test2 有数据的话,此示例中 test2 为空表,后续章节会介绍数据导入)。

创建表的场景如下:

假设需要创建一张用户表user,包括如下信息:
  • user_id bigint类型:用户标识,唯一标识一个用户。
  • gender bigint类型:性别(0,未知;1,男;2,女)。
  • age bigint:用户年龄。

按照Region(区域)和dt(日期)进行分区,生命周期为365天。

建表语句如下所示:
CREATE TABLE user 
( user_id BIGINT, gender BIGINT COMMENT '0 unknow,1 male, 2 Female', age BIGINT) 
PARTITIONED BY (region string, dt string) LIFECYCLE 365;

创建分区

当创建一张分区表之后,为了往该表里面导入不同分区数据,您需要创建分区。命令如下:
alter table table_name add [if not exists] partition partition_spec partition_spec: 
: (partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)
如上述示例,给用户表user添加区域为hangzhou,日期为20150923的分区,句子显示如下:
Alter table user add if not exists partition(region='hangzhou',dt='20150923');

查看表信息

当创建表成功之后,您可以通过desc <table_name>;命令查看表的信息。

您可执行命令desc test3;查看上述示例中表test3的信息。

结果显示如下:
odps@ $odps_project>desc test3;
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$maojing.mj@alibaba-inc.com | Project: $odps_project
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2015-09-18 12:26:57 |
| LastDDLTime: 2015-09-18 12:26:57 |
| LastModifiedTime: 2015-09-18 12:26:57 |
| Lifecycle: 100 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| key | boolean | | |
+------------------------------------------------------------------------------------+
| Partition Columns: |
+------------------------------------------------------------------------------------+
| pt | string |      |
| ds | string |      |
+------------------------------------------------------------------------------------+
您可执行命令 desc test4;查看上述示例中表test4的信息。
odps@ $odps_project>desc test4;
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$maojing.mj@alibaba-inc.com | Project: $odps_project
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2015-09-18 12:27:09 |
| LastDDLTime: 2015-09-18 12:27:09 |
| LastModifiedTime: 2015-09-18 12:27:09 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| key | boolean | | |
+------------------------------------------------------------------------------------+
| Partition Columns: |
+------------------------------------------------------------------------------------+
| pt | string |      |
| ds | string |      |
+------------------------------------------------------------------------------------+

您会发现,除生命周期属性外,test3的其他属性(字段类型、分区类型等)均与test4完全一致。查看表信息的更多详情请参见表操作

您如果查看test5的表信息,pt、ds两个字段仅会作为普通列存在,而不是表的分区 。

删除分区

删除分区的命令如下所示:
alter table table_name drop [if exists] partition_spec; partition_spec: 
: (partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)
比如删除区域为hangzhou,日期为20150923的分区,语句如下所示:
Alter table user drop if exists partition(region='hangzhou',dt='20150923');

删除表

删除表的命令如下所示:
DROP TABLE [IF EXISTS] table_name;
删除test2表的示例如下:
drop table test2;

更多详情请参见删除表