本文为您介绍表的基本概念、数据类型和使用限制。
系统架构
您可以通过如下系统架构图了解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。 |