MaxCompute数据类型

链接:数据类型_云原生大数据计算服务 MaxCompute(MaxCompute)-阿里云帮助中心

MaxCompute数据类型版本

MaxCompute设置数据类型版本属性的参数共有3个:

  • odps.sql.type.system.odps2:MaxCompute 2.0数据类型版本的开关,属性值为True或False。
  • odps.sql.decimal.odps2:MaxCompute 2.0的Decimal数据类型的开关,属性值为True或False。
  • odps.sql.hive.compatible:MaxCompute Hive兼容模式(即部分数据类型和SQL行为兼容Hive)数据类型版本的开关,属性值为True或False。

1.0数据类型版本

数据类型

类型

常量示例

描述

BIGINT100000000000L、-1L64位有符号整型。

取值范围:-263+1~263-1。

DOUBLE3.14159261E+764位二进制浮点型。
DECIMAL3.5BD、99999999999.9999999BD10进制精确数字类型。

整型部分取值范围:-1036+1~1036-1,小数部分精确到10-18。

STRING"abc"、'bcd'、"alibaba"、'inc'字符串类型。

长度限制为8 MB。

DATETIMEDATETIME'2017-11-11 00:00:00'日期时间类型。

取值范围:0000年1月1日~9999年12月31日。

BOOLEANTrue、FalseBOOLEAN类型。

取值范围: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命令参考

复杂数据类型

类型

定义方法

构造方法

ARRAY
  • ARRAY<BIGINT>
  • ARRAY<STRUCT<a:BIGINT, b:STRING>>
  • ARRAY(1, 2, 3)
  • ARRAY(NAMED_STRUCT('a', 1, 'b', '2'), NAMED_STRUCT('a', 3, 'b', '4'))
MAP
  • MAP<STRING, STRING>
  • MAP<BIGINT, ARRAY<STRING>>
  • MAP("k1", "v1", "k2", "v2")
  • MAP(1L, ARRAY('a', 'b'), 2L, ARRAY('x', 'y'))
STRUCT
  • STRUCT<'x', BIGINT, 'y', BIGINT>
  • STRUCT<'field1', BIGINT, 'field2', ARRAY<BIGINT>, 'field3', MAP<BIGINT>>
  • NAMED_STRUCT('x', 1, 'y', 2)
  • NAMED_STRUCT('field1', 100L, 'field2', ARRAY(1, 2), 'field3', MAP(1, 100, 2, 200))

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

unhex('FA34E10293CB42848573A4E39937F479')

二进制数据类型,目前长度限制为8 MB。

FLOAT

3.14F、cast(3.14159261E+7 as float)

32位二进制浮点型。
说明

由于计算机存储以及内部计算逻辑,用FLOAT类型进行计算时会有精度损失,如果对精度要求比较高,需要将FLOAT数据类型转换成DECIMAL类型进行计算。

DOUBLE

3.14D、3.14159261E+7

64位二进制浮点型。
说明

由于计算机存储以及内部计算逻辑,用DOUBLE类型进行计算时会有精度损失,如果对精度要求比较高,需要将DOUBLE数据类型转换成DECIMAL类型进行计算。

DECIMAL(precision,scale)

3.5BD、99999999999.9999999BD

10进制精确数字类型。

  • precision:表示最多可以表示多少位的数字。取值范围:1 <= precision <= 38

  • scale:表示小数部分的位数。取值范围: 0 <= scale <= 18

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

  • 同一个表中不能同时存在新老Decimal数据类型。

  • 执行setproject odps.sql.hive.compatible=true;命令开启Hive兼容模式时,Decimal(precision, scale)类型在数据导入(Tunnel Upload)和SQL运算过程中,如果数据的小数位数超过scale的大小,则会进行四舍五入的处理。如果整数部分超出限制,则会报错。

  • 当参数odps.sql.decimal.tostring.trimzero值为true时去掉小数点后末尾的零,为false时保留小数点后末尾的零,默认值为true。只对表里取数生效,对静态值不生效。

VARCHAR(n)

变长字符类型,n为长度。

取值范围:1~65535。

CHAR(n)

固定长度字符类型,n为长度。最大取值255。长度不足则会填充空格,但空格不参与比较。

STRING

"abc"、'bcd'、"alibaba"、'inc'

字符串类型,目前长度限制为8 MB。

DATE

DATE'2017-11-11'

日期类型,格式为yyyy-mm-dd

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

DATETIME

DATETIME'2017-11-11 00:00:00'

日期时间类型。

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

TIMESTAMP

TIMESTAMP'2017-11-11 00:00:00.123456789'

时间戳类型。

取值范围:0001-01-01 00:00:00.000000000~9999-12-31 23:59:59.999999999,精确到纳秒。
说明

TIMESTAMP类型本身与时区无关,在任何时区,TIMESTAMP类型存储的都是从Epoch(UTC 1970-01-01 00:00:00)开始的一个偏移量。您可以通过内建函数对TIMESTAMP类型数据执行与时区相关的计算,如cast(<a timestamp> as string)将TIMESTAMP类型数据按照当前时区值转换成STRING类型。

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常量支持连接,多(2个及以上)个字符串放一起,会自动连接成一个字符串,例如执行 select 'abc' 'efg' 'ddt';,返回结果为abcefgddt

  • 给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(struct(1, 2), struct(3, 4))

MAP

  • map<string, string>

  • map<smallint, array<string>>

  • map("k1", "v1","k2","v2")

  • map(1S, array("a", "b"), 2S, array('z','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))

JSON

JSON

JSON '123'


说明

  • MaxCompute的复杂数据类型可以被嵌套使用,相关的内建函数说明请参见ARRAYMAPSTRUCTJSON

  • MaxCompute的复杂数据类型最大Size建议不要超过1 MB,即复杂数据类型里存的数据大小不能超过1 MB,否则会造成计算过程OOM的错误。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值