本文介绍MaxCompute 2.0数据类型版本的定义、使用场景、支持的数据类型以及与其它数据类型版本的差异。
背景介绍
MaxCompute 2.0数据类型版本是MaxCompute三种数据类型版本之一。
适用于在2020年04月之前无存量数据的MaxCompute项目,且该项目依赖的产品组件支持2.0数据类型版本。
设置2.0数据类型版本
项目空间选择数据类型版本为2.0数据类型版本时,项目空间的数据类型属性参数定义如下。
setproject odps.sql.type.system.odps2=true; --打开MaxCompute 2.0数据类型。
setproject odps.sql.decimal.odps2=true; --打开Decimal 2.0数据类型。
setproject odps.sql.hive.compatible=false; --关闭Hive兼容模式。基础数据类型
类型 | 常量示例 | 描述 |
TINYINT | 1Y、-127Y |
|
SMALLINT | 32767S、-100S |
|
INT | 1000、-15645787 |
|
BIGINT | 100000000000L、-1L |
|
BINARY |
|
|
FLOAT | 3.14F、CAST(3.14159261E+7 AS FLOAT) |
|
DOUBLE | 3.14D、3.14159261E+7 |
|
DECIMAL(precision,scale) | 3.5BD、99999999999.9999999BD |
|
VARCHAR(n) | 无 |
|
CHAR(n) | 无 | 固定长度字符类型,n为长度,最大取值为255。长度不足则会填充空格,但空格不参与比较。 |
STRING | "abc"、'bcd'、"alibaba"、'inc' |
|
DATE | DATE'2017-11-11' |
|
DATETIME | DATETIME'2017-11-11 00:00:00' |
|
TIMESTAMP | TIMESTAMP'2017-11-11 00:00:00.123456789' |
|
TIMESTAMP_NTZ | TIMESTAMP_NTZ '2017-11-11 00:00:00.123456789' |
|
BOOLEAN | True、False |
|
INTERVAL |
| 代表时间段的数据类型,用来表示两个日期或时间之间的时间间隔。包含INTERVAL_YEAR_MONTH和INTERVAL_DAY_TIME两种类型。详情请参见INTERVAL数据类型。 |
Blob | 无 | 详情请参见Blob数据类型与多模态存储。 |
数据类型说明如下:
上述的各种数据类型均可以为NULL。
SQL中的INT关键字是32位整型。
-- 将a转换为32位整型。 CAST(a AS INT)常量
整型常量的语义会默认为INT类型。例如
SELECT 1 + a;中的整型常量1会被作为INT类型处理。如果常量过长,超过了INT的值域而又没有超过BIGINT的值域,则会作为BIGINT类型处理;如果超过了BIGINT的值域,则会被作为DOUBLE类型处理。给DECIMAL字段插入常量时,常量的写法需要与常量定义中的格式保持一致。例如下面示例代码中的
3.5BD。INSERT INTO test_tb(a) VALUES (3.5BD)STRING常量支持连接,多(2个及以上)个字符串放一起,会自动连接成一个字符串,例如执行
SELECT 'abc' 'efg' 'ddt';,返回结果为abcefgddt。
隐式转换
部分隐式类型转换会被禁用。例如,STRING->BIGINT、STRING->DATETIME、DOUBLE->BIGINT、DECIMAL->DOUBLE、DECIMAL->BIGINT有精度损失或者报错的风险。禁用类型可以通过CAST函数强制进行数据类型转换。
VARCHAR类型常量可以通过隐式转换为STRING常量。
表、函数以及UDF
参数涉及2.0数据类型的内置函数,在2.0数据类型版本下可以正常使用。
UDF包含的数据类型都会按照2.0数据类型进行解析重载。
分区列支持STRING、VARCHAR、CHAR、TINYINT、SMALLINT、INT、BIGINT数据类型。
复杂数据类型
MaxCompute的复杂数据类型可以被嵌套使用,最多支持不超过20层的嵌套。相关的内建函数说明请参见ARRAY、MAP、STRUCT或JSON。
MaxCompute的复杂数据类型最大Size建议不要超过1 MB,即复杂数据类型里存的数据大小不能超过1 MB,否则会造成计算过程OOM的错误。
类型 | 定义方法 | 构造方法 |
ARRAY |
|
|
MAP |
|
|
STRUCT |
|
|
JSON |
|
|
与其他数据类型版本的差异
DML语法行为差异
集合操作中的LIMIT语句行为不同。
例如,对于
SELECT * FROM t1 UNION ALL SELECT * FROM t2 LIMIT 10;:1.0数据类型版本下:
SELECT * FROM t1 UNION ALL SELECT * FROM ( SELECT * FROM t2 LIMIT 10) t2;。2.0数据类型版本下:
SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2 ) t LIMIT 10;。
ORDER BY、DISTRIBUTE BY、SORT BY和CLUSTER BY操作也具有上述行为特点。
IN表达式的类型解析不同。
例如
a in (1, 2, 3):1.0数据类型版本时,要求IN后面的括号里的所有值的类型必须一致。
2.0数据类型版本时,IN后面的括号里的所有值支持隐式类型转换一致即可。
INSERT语句转换规则不同。
Hive兼容数据类型:源数据类型如果可以显式转换为表中的数据类型,系统会自动插入转换函数并允许运行。
1.0和2.0数据类型版本:源数据类型需要隐式转换为表中的数据类型,否则报错。
--在Hive模式下成功,在其他模式下报错。 create table t (a bigint); insert into table select 1.5;
函数行为差异
+、-、*、/、POW函数Hive兼容数据类型版本:在数据溢出时绕回(即数据超出范围后返回初始值)。
1.0和2.0数据类型版本:在数据溢出时报告异常,其它模式下返回NULL。
>、>=、=、<、<=Hive兼容数据类型版本:在比较DOUBLE类型数据时,直接比较Double值。
1.0和2.0数据类型版本:在比较DOUBLE类型数据时,如果小数点后15位以前数据相同,认为数据相同。15位以后的数据不作比较。
位操作运算符
&、|、^Hive兼容数据类型版本:返回参数类型。
1.0和2.0数据类型版本:返回类型为BIGINT。
LENGTH、LENGTHB、FIND_IN_SET、INSTR、SIZE、HASH、SIGN函数
Hive兼容数据类型版本:返回类型为INT。
1.0和2.0数据类型版本:返回类型为BIGINT。
FLOOR、CEIL
Hive兼容数据类型版本:如果参数为DECIMAL类型,在Hive兼容数据类型版本下返回类型仍为DECIMAL。
1.0和2.0数据类型版本:如果参数为DECIMAL类型,在1.0和2.0数据类型版本下返回类型为BIGINT。
FROM_UNIXTIME
Hive兼容数据类型版本:返回值为STRING类型。
1.0和2.0数据类型版本:返回值为DATETIME类型。
CONCAT_WS
Hive兼容数据类型版本:如果一个被连接的输入字符串为NULL,此字符串被忽略。
1.0和2.0数据类型版本:如果一个被连接的输入字符串为NULL,则返回NULL。
FIND_IN_SET
Hive兼容数据类型版本:空字符串认为匹配字符串尾部。
--Hive兼容模式下 find_in_set("","") 结果是1。 find_in_set("", "a,") 结果是2。1.0和2.0数据类型版本:空字符串认为不匹配返回0。
REGEXP_(EXTRACT/REPLACE)
Hive兼容数据类型版本:REGEXP的模式定义符合Java regex规范。
1.0和2.0数据类型版本:REGEXP的模式定义符合MaxCompute规范。
SUBSTR
string substr(string <str>, bigint <start_position>[, bigint <length>])start_position:必填,为BIGINT类型,默认起始位置为1。
Hive兼容数据类型版本:当start_position为0时,与起始位置为1时相同。
1.0和2.0数据类型版本:当start_position为0时,返回NULL。