Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括array,map,struct,union。

一,原始数据类型

类型名称

大小

示例

TINYINT

1字节整数

45Y

SMALLINT

2字节整数

12S

INT

4字节整数

10

BIGINT

8字节整数

244L

FLOAT

4字节单精度浮点数

1.0

DOUBLE

8字节双精度浮点数

1.0

DECIMAL

任意精度带符号小数

DECIMAL(4, 2)范围:-99.99到99.99

BOOLEAN

true/false

TRUE

STRING

字符串,长度不定

“a”, ‘b’

VARCHAR

字符串,长度不定,有上限

“a”, ‘b’

CHAR

字符串,固定长度

“a”, ‘b’

BINARY

存储变长的二进制数据

 

TIMESTAMP

时间戳,纳秒精度

122327493795

DATE

日期

‘2016-07-03’

说明: 
1,关于整数和小数类型,整数默认情况下为INT,如果要声明为其他类型,通过后缀来标识(Y、S、L)。小数默认为DOUBLE类型,DECIMAL小数点左边允许的最大位数为38位,直接写DECIMAL默认等同于DECIMAL(10,0)。同时任意数值类型都可以隐式转换成更宽的数值类型(不丢精度)或者文本类型。 
2,关于文本类型,STRING存储变长的文本,对长度没有限制。理论上将STRING可以存储的大小为2GB,但是存储特别大的对象时效率可能受到影响。VARCHAR与STRING类似,但是长度上只允许在1-65355之间,超过最大长度会被截断。CHAR则用固定长度来存储数据,最大255。 
3,关于时间和日期类型,Hive提供了一些内置函数用于在TIMESTAMP与Unix时间戳(秒)和字符串之间做转换:

类型转换

结果

cast(date as date)

相同的日期。

cast(timestamp as date)

基于本地时区确定timestamp的年月日作为值返回。

cast(string as date)

如果字符串的格式为’YYYY-MM-DD’, 则对应的年月日返回。如果字符串不是该格式,则返回NULL。

cast(date as timestamp)

基于本地时区,返回日期对应午夜时间。

cast(date as string)

日期被转换为’YYYY-MM-DD’格式的字符串。

二,复杂类型

类型名称

大小

示例

ARRAY

存储同类型数据

ARRAY< data_type>

MAP

key-value,key必须为原始类型,value可以是任意类型

MAP< primitive_type, data_type>

STRUCT

类型可以不同

STRUCT< col_name : data_type [COMMENT col_comment], …>

UNION

在有限取值范围内的一个值

UNIONTYPE< data_type, data_type, …>

说明: 
关于元素的访问,ARRAY[1]访问第二个元素; 
map访问元素格式为map[‘key’]; 
STRUCT元素的访问使用点号; 
UNION类型声明语法为UNIONTYPE< data_type,data_type,…>,每个UNION类型的值都通过一个整数来表示其类型,这个整数就是索引,从0开始。例如:


1. CREATE TABLE union_test(u UNIONTYPE<int, double, array<string>,struct<a:int,b:string>>); 
2. SELECT u FROM union_test; 
3. {0:1} 
4. {1:2.0} 
5. {2:["three","four"]} 
6. {3:{"a":5,"b":"five"}} 
7. {2:["six","seven"]} 
8. {3:{"a":8,"b":"eight"}} 
9. {0:9} 
10. {1:10.0} 


在该例子中,union包含四种类型,分别为int、double、array和struct。从查询结果来看,第一个冒号前面的数字代表union中某种数据类型,比如0代表union的第一个数据类型int,1代表第二个数据类型double,以此类推。