分区表是指在创建表时指定分区空间,即指定表内的某几个字段作为分区列。分区表实际就是对应分布式文件系统上的的独立的文件夹,该文件夹下是该分区所有数据文件。而分区可以理解为分类,通过分类把不同类型的数据放到不同的目录下。分类的标准就是分区字段,可以是一个,也可以是多个。

分区表的意义在于优化查询。查询表时通过where字句查询指定所需查询的分区,避免全表扫描,提高处理效率,降低计算费用。

MaxCompute将分区列的每个值作为一个分区(目录),您可以指定多级分区,即将表的多个字段作为表的分区,分区之间如多级目录的关系。

使用数据时,如果指定需要访问的分区名称,则只会读取相应的分区,可避免全表扫描,提高处理效率,降低费用。

分区类型

MaxCompute2.0对分区类型的支持进行了扩充,目前MaxCompute支持Tinyint、Smallint、Int、Bigint、Varchar和String分区类型。
说明 在旧版MaxCompute中,仅承诺String类型分区。因为历史原因,虽然可以指定分区类型为Bigint,但是除了表的schema表示其为Bigint外,任何其他情况实际都被处理为String。示例如下:
create table parttest (a bigint) partitioned by (pt bigint);
insert into parttest partition(pt) select 1, 2 from dual;
insert into parttest partition(pt) select 1, 10 from dual;
select * from parttest where pt >= '2';

执行上述语句后,返回的结果只有一行,因为10被当作字符串和2比较,所以没能返回。

分区使用限制

分区有以下使用限制。
  • 单表分区层级最多6级。
  • 单表分区数最多允许60000个分区。
  • 一次查询最多查询分区数为10000个分区。
  • String分区类型的分区值不支持使用中文。
示例如下:
--创建一个二级分区表,以日期为一级分区,地域为二级分区
create table src (key string, value bigint) partitioned by (pt string,region string);
查询时,Where条件过滤中使用分区列作为过滤条件。
select * from src where pt='20170601'and region='hangzhou'; --正确使用方式。MaxCompute在生成查询计划时只会将'20170601'分区下region为'hangzhou'二级分区的数据纳入输入中。
select * from src where pt = 20170601; -- 错误的使用方式。在这样的使用方式下,MaxCompute并不能保障分区过滤机制的有效性。pt是String类型,当String类型与Bigint(20170601)比较时,MaxCompute会将二者转换为Double类型,此时有可能会有精度损失。

部分对分区操作的SQL的运行效率则较低,会给您带来较高的计费,例如输出到动态分区(DYNAMIC PARTITION)

对于部分MaxCompute的操作命令,处理分区表和非分区表时的语法有差别,详情请参见表操作INSERT操作