Hive兼容数据类型版本是MaxCompute三种数据类型版本之一,该数据类型版本下仅支持Hive兼容数据类型。本文为您介绍Hive兼容数据类型版本的定义、支持的数据类型以及与其他数据类型版本的差异。
定义
项目空间选择数据类型版本为Hive兼容数据类型版本时,项目空间的数据类型属性参数定义如下。
setproject odps.sql.type.system.odps2=true; --打开MaxCompute 2.0数据类型。
setproject odps.sql.decimal.odps2=true; --打开Decimal 2.0数据类型。
setproject odps.sql.hive.compatible=true; --打开Hive兼容模式。
适用场景
适用于从Hadoop迁移的MaxCompute项目,且该项目依赖的产品组件支持2.0数据类型版本。
基础数据类型
Hive兼容数据类型版本支持的基础数据类型与2.0数据类型定义基本一致,只有DECIMAL数据类型在两个版本下有些差异。
类型 | 常量示例 | 描述 |
---|---|---|
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') | 二进制数据类型,目前长度限制为8MB。 |
FLOAT | cast(3.14159261E+7 as float) | 32位二进制浮点型。 |
DOUBLE | 3.14159261E+7 | 64位二进制浮点型。 |
DECIMAL(precision,scale) | 3.5BD、 99999999999.9999999BD | 10进制精确数字类型。
如果不指定以上两个参数,则默认为 |
VARCHAR(n) | 无 | 变长字符类型,n为长度。 取值范围:1~65535。 |
CHAR(n) | 无 | 固定长度字符类型,n为长度。最大取值255。长度不足则会填充空格,但空格不参与比较。 |
STRING | "abc"、'bcd'、"alibaba"、'inc' | 字符串类型,长度限制为8 MB。 |
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数据类型的内置函数,可以正常使用。
- UDF包含的数据类型都会按照Hive兼容数据类型进行解析重载。
- 分区列支持STRING、VARCHAR、CHAR、TINYINT、SMALLINT、INT、BIGINT数据类型。
- Hive模式下,部分函数不支持分区裁剪,详情请参见与Hive、MySQL、Oracle内建函数对照表。
- 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 |
|
|
MAP |
|
|
STRUCT |
|
|
与其他数据类型版本的差异
- 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。
- Hive兼容数据类型版本:空字符串认为匹配字符串尾部。
- 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。