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

系统架构

您可以通过如下系统架构图了解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位有符号整数。范围:-231~231 -1。

      BIGINT

      100000000000L、-1L

      64位有符号整型。范围:-263+1~263-1。

      FLOAT

      32位二进制浮点型。

      DOUBLE

      3.1415926 1E+7

      8字节双精度浮点数或64位二进制浮点型。

      DECIMAL

      3.5BD、99999999999.9999999BD

      10进制精确数字类型。整数部分范围:-1036+1~1036-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。