一、概述
以下是Hive支持的所有数据类型
1、数值类型
(1)TINYINT 1字节带符号整数,取值范围-128 to 127
(2)SMALLINT 2字节带符号整数,取值范围-32,768 to 32,767
(3)INT 4字节带符号整数,取值范围-2,147,483,648 to 2,147,483,647
(4)BIGINT 8字节带符号整数,取值范围-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
(5)FLOAT 4字节单精度浮点数
(6)DOUBLE 8字节双精度浮点数
(7)DECIMAL 从Hive0.11.0开始引入,表示38位精度的数值,从Hive0.13.0引入可自定义精度与取值范围的DECIMAL类型的数
2、日期时间类型
(1) TIMESTAMP 从Hive 0.8.0开始引入
(2)DATE 从Hive 0.12.0开始引入
3、字符串类型
(1)STRING
(2)VARCHAR 从Hive 0.12.0开始引入
(3)CHAR 从Hive 0.13.0开始引入
4、混杂(Misc)类型
(1)BOOLEAN
(2)BINARY 从Hive 0.8.0开始引入
5、复合(Complex)类型
(1)arrays: ARRAY<data_type>
(2)maps: MAP<primitive_type,data_type>
(3)structs: STRUCT<col_name :data_type [COMMENT col_comment], ...>
(4)union: UNIONTYPE<data_type,data_type, ...> (注: 从Hive 0.7.0开始引入)
二、列类型
1、整数类型(TINYINT,SMALLINT, INT, BIGINT)
整型常量默认以INT型表示, 如果数值超过INT的取值范围,自动以BIGINT型表示。如果加了强制后缀,则按照后缀指示的类型表示.
类型 后缀 示例
TINYINT Y 100Y
SMALLINT S 100S
BIGINT L 100L
2、Strings
字符串常量用单引号或者双引号表示,在字符串常量中,像C语言那样使用转义字符.
3、Varchar
使用Varchar类型变量的时候需要定义字串的长度(取值范围在1--65355), 用于指明可接受的最大字符个数。当一个String字串被转换成或赋值给一个Varchar变量时,如果String字串的长度超过了Varchar变量长度,超长部分会被自动截取掉,Varchar变量最终长度由截取后的字符串包含的码点数量确定。像String一样,Varchar尾部的空格是有意义的,并且会影响比较运算的结果。
Non-generic UDFs不能直接使用varchar类型作为输入参数或者返回结果。String类型的UDFs会把varchar类型的值转换成strings传递给UDF. 为了可以直接使用varchar类型做参数或者直接返回varchar的值,需要创建Generic UDF。还有另外一些情况不支持varchar,比如依赖反射技术用于返回类型信息的方法,包括一些Serde的实现.
4、Char
Char跟Varchar比较像,但是它是定长的。当字符的个数小于定义的长度时,尾部以空格填充,但是尾部的空格是无意义的,不影响比较运算的结果。Char的最大长度为255。
5、Timestamps
支持传统的UNIX timestamp,可以达到纳秒精度,支持的转换(Supported conversions):
• 整数类型:以秒为单位转换为UNIXtimestamp
• 浮点类型:按照decimal精度以秒为单位转换为UNIX timestamp
• Strings类型:JDBC服从java.sql.Timestamp格式"YYYY-MM-DD HH:MM:SS.fffffffff" (9位小数的精度)
Timestamps是自从UNIX诞生点(1970-1-1 0:00:00)开始的时间(秒数),跟时区无关,同时也可以很方便地实现与UTC_timestamp之间进行转换。所有的日期时间函数(datetime UDFs)像month, day, year, hour等也可以用于TIMESTAMP类型。
在文本文件中,Timestamps必须使用格式yyyy-mm-dd hh:mm:ss[.f...],如果是其他的格式,则需要把它们定义成合适的类型 (INT, FLOAT, STRING, 等等),并且使用UDF转换。
6、Dates
DATE值的格式是YYYY-¬MM—DD,只有年、月、日,没有时间部分。该类型的取值范围为0000-¬01-¬01 to 9999-¬12-¬31。
Date类型可以使用Cast函数与Date、 Timestamp 、String三种类型进行相互转换:
cast(date as date) | Same date value |
cast(timestamp as date) | 把Timestamp数据转换成基于本地时区的Date值,格式为yyyy/mm/dd |
cast(string as date) | 如果字串的格式是'YYYY-MM-DD', 则返回同样格式的Date值,否则返回NULL。 |
cast(date as timestamp) | 返回基于本地时区的当日零点时的Timestamp值 。 |
cast(date as string) | 返回'YYYY-MM-DD'格式的字串. |
7、Decimals
DECIMAL类型基于Java中表达任意精度的十进制数的
BigDecimal,可以进行+, -, *, /等代数运算及Floor, Ceil, Round 等相关的数学函数运算,可以方便地与其他数值型数据使用CAST进行类型转换。可以同时支持科学记数法与非科学记数法数据混合存在。例如在一个列中,可以允许同时有1E+44与4004存在。
在Hive 0.11 and 0.12,DECIMAL的精度固定是
38位,从Hive 0.13 开始,可以在创建表时指定DECIMAL类型列的
总长度与小数位数,例如:
CREATE TABLE foo (
a DECIMAL,
b DECIMAL(9, 7)
)
Decimal常量能够表示精度与数值范围都要超过DOUBLE型的浮点数。 Decimal 数据类型存储精确的数值,而DOUBLE类型只能存储近似值。Decimal类型一般用在那些无法用近似的DOUBLE类型表示的场合,比如金融领域的等与不等的检查、取整操作等。有时需要使用Decimal类型表达超过DOUBLE型取值范围的数据,或者表达非常小的数据 (-10-308 to 10-308)。
Decimal类型数据支持基本代数运算、数学UDFs和UDAF,使用语法跟DOUBLE完全一样。DECIMAL类型数据支持的基本数学操作包括:
- Positive
- Negative
- Addition
- Subtraction
- Multiplication
- Division
- Average (avg)
- Sum
- Count
- Modulus (pmod)
- Sign – Hive 0.13.0 and later
- Exp – Hive 0.13.0 and later
- Ln – Hive 0.13.0 and later
- Log2 – Hive 0.13.0 and later
- Log10 – Hive 0.13.0 and later
- Log(base) – Hive 0.13.0 and later
- Sqrt – Hive 0.13.0 and later
- Sin – Hive 0.13.0 and later
- Asin – Hive 0.13.0 and later
- Cos – Hive 0.13.0 and later
- Acos – Hive 0.13.0 and later
- Tan – Hive 0.13.0 and later
- Atan – Hive 0.13.0 and later
- Radians – Hive 0.13.0 and later
- Degrees – Hive 0.13.0 and later
- Floor
- Ceiling
- Round
- Power 指数只能为正整数
通过CAST函数支持DECIMAL类型数据与其他任何基本数据类型之间的转换,比如像integer, double, boolean,等等。通过CAST进行类型转换时,需要对DECIMAL类型验证,脚本文件udf7.q可以验证上面提到的所有UDFs。在Hive的TestCliDriver framework 添加了两个DECIMAL类型验证脚本: decimal_1.q 和decimal_2.q。三个取整函数因为无法明确进行验证,当前已经不对其验证。
8、Union类型
Union类型从Hive 0.7.0 (HIVE-537)引入,在HIVE-2390做了更深入的介绍。
可以把Union类型数据的一部分准确的按照它本身的类型从整个数据中取出来,可以使用create_union
UDF创建Union类型的实例。示例如下
CREATE TABLE union_test(foo UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>);
SELECT foo FROM union_test;
{0:1}
{1:2.0}
{2:["three","four"]}
{3:{"a":5,"b":"five"}}
{2:["six","seven"]}
{3:{"a":8,"b":"eight"}}
{0:9}
{1:10.0}
在上面的查询结果中,最左边的Tag指明属于整个UNION的哪一部分。Tag=0意味着属于第一个数据类型:整数,Tag=2意味着属于第三个数据类型:数组。下面示例说明了如何通过给create_union
UDF指定Tag来创建Union:
SELECT create_union(0, key), create_union(if(key<100, 0, 1), 2.0, value), create_union(1, "a", struct(2, "b")) FROM src LIMIT 2;
{0:"238"} {1:"val_238"} {1:{"col1":2,"col2":"b"}}
{0:"86"} {0:2.0} {1:{"col1":2,"col2":"b"}}
四、处理NULL值
缺失值以NULL表示。导入带有Null域的数据时,需要检查元数据库SerDe的文档。缺省文本格式使用LazySimpleSerDe规则,在导入数据时它把字串\N看作NULL。
五、隐含的数据转换
| void | boolean | tinyint | smallint | int | bigint | float | double | decimal | string | varchar | timestamp | date | binary |
void to | true | true | true | true | true | true | true | true | true | true | true | true | true | true |
boolean to | false | true | false | false | false | false | false | false | false | false | false | false | false | false |
tinyint to | false | false | true | true | true | true | true | true | true | true | true | false | false | false |
smallint to | false | false | false | true | true | true | true | true | true | true | true | false | false | false |
int to | false | false | false | false | true | true | true | true | true | true | true | false | false | false |
bigint to | false | false | false | false | false | true | true | true | true | true | true | false | false | false |
float to | false | false | false | false | false | false | true | true | true | true | true | false | false | false |
double to | false | false | false | false | false | false | false | true | true | true | true | false | false | false |
decimal to | false | false | false | false | false | false | false | false | true | true | true | false | false | false |
string to | false | false | false | false | false | false | false | true | true | true | true | false | false | false |
varchar to | false | false | false | false | false | false | false | true | true | true | true | false | false | false |
timestamp to | false | false | false | false | false | false | false | false | false | true | true | true | false | false |
date to | false | false | false | false | false | false | false | false | false | true | true | false | true | false |
binary to | false | false | false | false | false | false | false | false | false | false | false | false | false | true |