本文为您介绍表的基本概念、数据类型和使用限制。

系统架构

您可以通过如下系统架构图了解MaxCompute数据的处理流程。
MaxCompute中表的类型如下。

基本概念

  • 项目

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

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

    MaxCompute的表有两种类型:
    • 内部表:所有数据都存储在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 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) 变长字符类型,n为长度。取值范围:1~65535。
      STRING "abc"、'bcd'、"alibaba"、"inc" 字符串类型。长度限制为8 MB。
      BINARY 二进制数据类型。长度限制为8 MB。
      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))
      您可以执行如下命令打开复杂数据类型:
      • Session级别,需要将set命令和SQL命令一起提交。
        set odps.sql.type.system.odps2=true;
      • Project级别,需要Project Owner执行。
        setproject odps.sql.type.system.odps2=true;
      说明
      • 数据精确的场景,不建议使用DOUBLE类型。
      • Round函数对DOUBLE类型字段的处理结果不一定是准确的四舍五入结果。
      • 当您在函数Round、Trunc、Floor、Ceil和Bround中使用DOUBLE类型数据时,需要注意精度问题。

表的限制

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