MaxCompute以表(Table)作为数据存储单元。表在逻辑上是由行和列组成的二维结构,每行代表一条记录,每列表示相同数据类型的一个字段。一条记录可以包含一个或多个列,各个列的名称和类型构成这张表的Schema。

系统架构

MaxCompute的应用架构如下图所示。您可以通过该图了解数据的处理流程。

MaxCompute项目空间的逻辑对象如下图所示。

基本概念

  • 项目空间

    项目空间(Project)是MaxCompute的基本组织单元,类似于传统数据库的Database或Schema的概念。它是进行多用户隔离和访问控制的主要边界。一个用户可以同时拥有多个项目空间的权限。通过安全授权,用户可以在一个项目空间中访问另一个项目空间中的对象,例如表(Table)、资源(Resource)、函数(Function)和实例(Instance)。

  • 表(Table)是MaxCompute的数据存储单元。它在逻辑上是由行和列组成的二维结构,每行代表一条记录,每列表示相同数据类型的一个字段。一条记录可以包含一个或多个列,各个列的名称和类型构成这张表的Schema。

    MaxCompute的表有两种类型:内部表和外部表(MaxCompute2.0版本已支持外部表)。
    • 对于内部表,所有的数据都被存储在MaxCompute中,表中的列可以是MaxCompute支持的任意一种数据类型。本文所介绍的相关规范只针对此类表。
    • 对于外部表,MaxCompute并不真正持有数据,表格的数据可以存放在OSS或OTS中 。MaxCompute仅会记录表格的Meta信息,但您可以通过MaxCompute的外部表机制处理OSS或OTS上的非结构化数据,例如视频、音频、基因、气象、地理信息等。本文所介绍的相关规范不包含此类表。
  • 分区

    分区表是指在创建表时指定分区空间,即指定表内的某几个字段作为分区列。大多数情况下,您可以将分区类比为文件系统下的目录,该文件夹存放该分区所有数据文件。分区的作用类似于分类,即通过分类把不同类型的数据放到不同的目录下。分类的标准是分区的字段,即不同的字段代表不同的分类标准。分区字段的个数没有限制,您可以设置一个或多个分区字段。分区表的意义在于优化查询。查询表时通过where语句查询指定所需查询的分区,避免全表扫描,提高处理效率,降低费用。

  • 建表语法
    CREATE [EXTERNAL] 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], ...)]
    [CLUSTERED BY (col_name [, col_name, ...]) [SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])] INTO number_of_buckets BUCKETS] -- 用于创建Hash Clustering表时设置表的Shuffle和Sort属性。
    [STORED BY StorageHandler] -- 仅限外部表
    [WITH SERDEPROPERTIES (Options)] -- 仅限外部表
    [LOCATION OSSLocation]-- 仅限外部表
    [LIFECYCLE days]
    [AS select_statement];
    CREATE TABLE [IF NOT EXISTS] table_name
    LIKE existing_table_name;
  • 数据类型
    基础数据类型
    类型 是否新增 常量定义 描述
    TINYINT 1Y、-127Y 8位有符号整形,范围:-128~127。
    SMALLINT 32767S、-100S 16位有符号整形, 范围:-32768~32767。
    INT 1000、-15645787(注释1) 32位有符号整形,范围:-2 31 ~2 31 -1。
    BIGINT 100000000000L、 -1L 64位有符号整形, 范围-2 63 + 1~2 63 - 1。
    FLOAT 32位二进制浮点型
    DOUBLE 3.1415926 1E+7 8字节双精度浮点数或64位二进制浮点型
    DECIMAL 3.5BD、99999999999.9999999BD 10进制精确数字类型,整形部分范围-10 36 +1~10 36 -1, 小数部分精确到10 -18
    VARCHAR(n) 无 (注释2) 变长字符类型,n为长度,取值范围:1~65535。
    STRING "abc"、'bcd'、"alibaba"、”inc“ ( 注释3 ) 字符串类型,目前长度限制为8M。
    BINARY 二进制数据类型,目前长度限制为8M。
    DATETIME DATETIME '2017-11-11 00:00:00' 日期时间类型,使用东八区时间作为系统标准时间。范围从0000年1月1日~9999年12月31日,精确到毫秒 。
    TIMESTAMP TIMESTAMP '2017-11-11 00:00:00.123456789' 与时区相关的时间戳类型,范围从0000年1月1日~9999年12月31日23.59:59.999999999, 精确到纳秒。
    BOOLEAN TRUE、FALSE 布尔类型, 值为TRUE或FALSE。
  • 复杂数据类型
    类型 定义方法 构造方法
    ARRAY array<int>、array<struct<a:int,b:string>> array(1, 2, 3)、array(array(1, 2)、array(3, 4))
    MAP map<string, string>、map<smallint, array<string>> map("k1", "v1", "k2", "v2")、map(1S, array('a', 'b'), 2S, array('x', 'y’))
    STRUCT struct<x:int, y:int>、struct<field1:bigint, field2:array<int>, field3:map<int, int>> named_struct('x', 1, 'y', 2)、 named_struct('field1', 100L, 'field2', array(1, 2), 'field3', map(1, 100, 2, 200)
    当使用新基础数据类型和复杂数据类型时,应该一起执行set命令和SQL命令。set命令如下:
    • set odps.sql.type.system.odps2=true;--session级别
    • setproject odps.sql.type.system.odps2=true;--project级别,需project owner执行。
    说明
    • 对于精确的数据场景,不建议使用DOUBLE类型。
    • round函数对DOUBLE类型字段的处理结果不一定是准确的四舍五入结果。
    • 当在函数round、trunc、floor、ceil、bround中使用DOUBLE类型数据时,需要注意精度问题。

表的限制项

边界名 最大值/限制条件 分类 说明
表名长度 128字节 长度限制 表名和列名中不能出现特殊字符,只能出现英文的a-z、A-Z及数字和下划线,且必须以字母开头。
注释长度 1024字节 长度限制 注释内容为长度不超过1024字节的有效字符串。
表的列定义 10000个 数量限制 单表的列定义个数最多10000个。
单表分区数 60000个 数量限制 一张表最多允许60000个分区。
表的分区层级 6级 数量限制 表的分区层级不能超过6个层级。