MaxCompute 2.0数据类型版本是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兼容模式。

适用场景

适用于在2020年04月之前无存量数据的MaxCompute项目,且该项目依赖的产品组件支持2.0数据类型版本。

基础数据类型

类型 常量示例 描述
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。

BINARY 二进制数据类型,目前长度限制为8MB。
FLOAT 32位二进制浮点型。
DOUBLE 3.1415926 1E+7 64位二进制浮点型。
DECIMAL(precision,scale) 3.5BD、99999999999.9999999BD 10进制精确数字类型。
  • precision:表示最多可以表示多少位的数字。取值范围:1 <= precision <= 38
  • scale:表示小数部分的位数。取值范围: 0 <= scale <= 18

如果不指定以上两个参数,则默认为decimal(38,18)

说明
  • 同一个表中不能同时存在新老Decimal数据类型。
  • Decimal(precision, scale)类型在数据导入 (Tunnel Upload)和SQL运算过程中,如果数据的小数位数超过scale的大小,则会进行四舍五入的处理。如果整数部分超出限制,则会报错。
VARCHAR(n) 变长字符类型,n为长度。

取值范围:1~65535。

CHAR(n) 固定长度字符类型,n为长度。最大取值255。长度不足则会填充空格,但空格不参与比较。
STRING “abc”、’bcd’、”alibaba”、‘inc’ 字符串类型,目前长度限制为8MB。
DATE DATE'2017-11-11' 日期类型,格式为yyyy-mm-dd

取值范围:0000-01-01~9999-12-31。

DATETIME DATETIME ‘2017-11-11 00:00:00’ 日期时间类型。

取值范围:0000-01-01 00:00:00.000~9999-12-31 23.59:59.999,精确到毫秒。

TIMESTAMP TIMESTAMP ‘2017-11-11 00:00:00.123456789’ 与时区无关的时间戳类型。

取值范围:0000-01-01 00:00:00.000000000~9999-12-31 23.59:59.999999999,精确到纳秒。

说明 对于部分时区相关的函数,例如cast(<a timestamp> as string),要求TIMESTAMP按照与当前时区相符的方式来展现。
BOOLEAN True、False BOOLEAN类型。

取值范围:True、False。

数据类型说明如下:
  • 上述的各种数据类型均可以为NULL。
  • SQL中的INT关键字是32位整型。
    --将a转换为32位整型。
    cast(a as INT)
  • 整型常量的语义会默认为INT类型。例如SELECT 1 + a;中的整型常量1会被作为INT类型处理。如果常量过长,超过了INT的值域而又没有超过BIGINT的值域,则会作为BIGINT类型处理;如果超过了BIGINT的值域,则会被作为DOUBLE类型处理。
  • 隐式转换
    • 部分隐式类型转换会被禁用。例如,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数据类型。
  • STRING常量支持连接,例如,abc和xyz会解析为abcxyz。
  • 给DECIMAL字段插入常量时,常量的写法需要与常量定义中的格式保持一致。例如下面示例代码中的3.5BD
    insert into test_tb(a) values (3.5BD)
  • DATETIME查询显示的时间值不包含毫秒。Tunnel命令通过-dfp来指定时间格式,可以指定到毫秒显示,例如tunnel upload -dfp 'yyyy-MM-dd HH:mm:ss.SSS'。关于Tunnel命令的更多信息,请参见Tunnel命令参考

复杂数据类型

类型 定义方法 构造方法
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))
说明 MaxCompute的复杂数据类型可以被嵌套使用,相关的内建函数说明请参见ARRAYMAPSTRUCT

与其他数据类型版本的差异

  • 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。
    • ROUND
      • Hive兼容数据类型版本:如果参数为TINYINT、SMALLINT、INT、BIGINT时,返回值类型与参数类型相同。
      • 1.0和2.0数据类型版本:如果参数为TINYINT、SMALLINT、INT、BIGINT时,返回值为DATETIME类型。
    • 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规范。