MaxCompute 1.0数据类型版本是MaxCompute三种数据类型版本之一,该数据类型版本下仅支持1.0数据类型。本文为您介绍1.0数据类型版本的定义、支持的数据类型以及与其它数据类型版本的差异。

定义

项目选择数据类型版本为1.0数据类型版本时,项目的数据类型属性定义如下。
setproject odps.sql.type.system.odps2=false; --关闭MaxCompute 2.0数据类型。
setproject odps.sql.decimal.odps2=false; --关闭decimal 2.0数据类型。
setproject odps.sql.hive.compatible=false; --关闭Hive兼容模式。

适用场景

适用于早期使用的MaxCompute项目,且该项目依赖的产品组件不支持2.0数据类型版本。

数据类型

类型 常量示例 描述
BIGINT 100000000000L、-1L 64位有符号整型。

取值范围:-2 63 +1~2 63 -1。

DOUBLE 3.1415926 1E+7 64位二进制浮点型。
DECIMAL 3.5BD、99999999999.9999999BD 10进制精确数字类型。

整型部分取值范围:-10 36 +1~10 36 -1, 小数部分精确到10 -18 。固定54位数字,其中整数部分36位,小数位为18位。

STRING “abc”、’bcd’、”alibaba”、‘inc’ 字符串类型,目前长度限制为8MB。
DATETIME DATETIME ‘2017-11-11 00:00:00’ 日期时间类型。

取值范围:0000年1月1日~9999年12月31日,精确到毫秒。

BOOLEAN True、False BOOLEAN类型。

取值范围:True、False。

对于上述数据类型说明如下:
  • 上述的各种数据类型均可为NULL。
  • 整型常量的语义默认为BIGINT类型。如果常量过长,超过了BIGINT的值域(例如1,000,000,000,000,000,000,000,000)则会被作为DOUBLE类型处理。例如SELECT 1 + a;中的整型常量1会被作为BIGINT类型处理。
  • 参数涉及2.0数据类型的内置函数,在1.0数据类型版本下无法正常使用。
  • 分区表的分区列的数据类型只支持STRING类型。
  • 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命令参考

与其它数据类型版本差异说明

  • 1.0数据类型版本下集合操作中的LIMIT语句行为和2.0数据类型版本下不同。
    例如,对于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表达式的类型解析和2.0数据类型版本有所不同。
    例如a in (1, 2, 3)
    • 1.0数据类型版本时,要求IN后面的括号里的所有值,其类型必须一致。
    • 2.0数据类型版本时,IN后面的括号里的所有值支持隐式类型转换一致。

复杂数据类型

类型 定义方法 构造方法
ARRAY
  • array<bigint>
  • array<struct<a:bigint, b:string>>
  • array(1, 2, 3)
  • array(array(1, 2), array(3, 4))
MAP
  • map<string, string>
  • map<bigint, array<string>>
  • map(“k1”, “v1”, “k2”, “v2”)
  • map(1S, array(‘a’, ‘b’), 2S, array(‘x’, ‘y’))
STRUCT
  • struct<x:bigint, y:bigint>
  • struct<field1:bigint, field2:array<bigint>, field3:map<bigint,bigint>>
  • named_struct(‘x’, 1, ‘y’, 2)
  • named_struct(‘field1’, 100L, ‘field2’, array(1, 2), ‘field3’, map(1, 100, 2, 200))
说明 MaxCompute的复杂数据类型可以被嵌套使用,相关的内建函数说明请参见ARRAYMAPSTRUCT