Hive数据类型
1. Hive数据类型
Hive⽀持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,map,struct。下⾯是Hive 数据类型的⼀个总结:
分类类型描述字⾯量⽰例
原始类
BOOLEAN true/false TRUE
TINYINT1字节的有符号整数 -128~1271Y
SMALLINT2个字节的有符号整数,-32768~327671S
INT4个字节的带符号整数1
BIGINT8字节带符号整数1L
FLOAT4字节单精度浮点数1.0
DOUBLE8字节双精度浮点数  1.0
DEICIMAL任意精度的带符号⼩数  1.0
STRING字符串,变长“a”,’b’
VARCHAR变长字符串“a”,’b’
CHAR固定长度字符串“a”,’b’
BINARY字节数组⽆法表⽰
TIMESTAMP时间戳,纳秒精度122327493795
DATE⽇期‘2016-03-29’复杂类
ARRAY有序的的同类型的集合array(1,2)
MAP key-value,key必须为原始类型,value可以任意
类型
map(‘a’,1,’b’,2)
STRUCT字段集合,类型可以不同
struct(‘1’,1,1.0),
named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0)
UNION在有限取值范围内的⼀个值create_union(1,’a’,63)
2. 基本类型
HQL的基本类型和Java的很接近,虽然受到⼀些MySQL命名的影响。
2.1 整数类型
Hive有4种带符号的整数类型:TINYINT,SMALLINT,INT,BIGINT,分别对应Java中的byte,short,int,lon
g。字节长度分别为1,2,4,8字节。在使⽤整数字⾯量时,默认情况下为INT,如果要声明为其他类型,通过后缀来标识:
类型后缀例⼦
TINYINT Y100Y
SMALLINT S100S
BIGINT L100L
2.2 ⼩数
浮点类型包括FLOAT和DOUBLE两种,对应到Java的float和double,分别为32位和64位浮点数。DECIMAL⽤于表⽰任意精度的⼩树,类似于Java的BigDecimal,通常在货币当中使⽤。例如DECIMAL(5,2)⽤于存储-999.99到999.99的数字,省略掉⼩数位,DECIAML(5)表⽰-99999到99999的数字。DECIMAL则等同于DECIMAL(10,0)。⼩数点左边允许的最⼤位数为38位。
数值类型总结如下表:
2.3 ⽂本类型
Hive有3种类型⽤于存储字⽂本。STRING存储变长的⽂本,对长度没有限制。理论上将STRING可以存储的⼤⼩为2GB,但是存储特别⼤的对象时效率可能受到影响,可以考虑使⽤Sqoop提供的⼤对象⽀持。VARCHAR与STRING类似,但是长度上只允许在1-65355之间。例如VARCHAR(100).CHAR则⽤固定长度来存储数据。
2.4 布尔及⼆进制
BOOLEAN表⽰⼆元的true或false。
BINARY⽤于存储变长的⼆进制数据。
2.5 时间类型
TIMESTAMP则存储纳秒级别的时间戳,同时Hive提供了⼀些内置函数⽤于在TIMESTAMP与Unix时间戳(秒)和字符串之间做转换。例如:
cast(date as date)
cast(timestamp as date)
cast(string as date)
cast(date as string)
时间戳类型的数据不包含任务的时区信息,但是to_utc_timestamp和from_utc_timestamp函数可以⽤于时区转换。DATE类型则表⽰⽇期,对应年⽉⽇三个部分。
3. 类型转换
Hive的类型层次中,可以根据需要进⾏隐式的类型转换,例如TINYINT与INT相加,则会将TINYINT转化成INT然后INT做加法。隐式转换的规则⼤致可以归纳如下:
任意数值类型都可以转换成更宽的数据类型(不会导致精度丢失)或者⽂本类型。
所有的⽂本类型都可以隐式地转换成另⼀种⽂本类型。也可以被转换成DOUBLE或者DECIMAL,转换失败时抛出异常。decimal是整数数据类型
BOOLEAN不能做任何的类型转换。
时间戳和⽇期可以隐式地转换成⽂本类型。
也可以使⽤CAST进⾏显式的类型转换,例如CAST('1' as INT),如果转换失败,CAST返回NULL。
4. 复杂类型
Hive有4种复杂类型的数据结构:ARRAY,MAP,STRUCT,UNION。
4.1 ARRAY和MAP
ARRAY和MAP类型与Java中的数据和映射表。数组的类型声明格式为ARRAY<data_type>,元素访问通过0开始的下标,例如arrays[1]访问第⼆个元素。
MAP通过MAP<primitive_type,data_type>来声明,key只能是基本类型,值可以是任意类型。map的元素访问则使⽤[],例如map['key1']. 4.2 STRUCT
STRUCT则封装⼀组有名字的字段(named filed),其类型可以是任意的基本类型,元素的访问使⽤点号。
4.3 UNION
UNION则类似于C语⾔中的UNION结构,在给定的任何⼀个时间点,UNION类型可以保存指定数据类型中的任意⼀种。类型声明语法为UNIONTYPE<data_type,data_type,…>。每个UNION类型的值都通过⼀个整数来表⽰其类型,这个整数位声明时的索引,从0开始。例如:
CREATE TABLE union_test(foo UNIONTYPE<int,double,array<string>,strucy<a:int,b:string>>);
foo的⼀些取值如下:
{0:1}
{1:2.0}
{2:["three" , "four"]}
{3:["a":5,b:"five"]}
{0:9}
其中冒号左边的整数代表数据类型,必须在预先定义的范围类,通过0开始的下标表⽰。冒号右边是该
类型的取值。
下⾯的这个CRATE语句⽤到了这4中复杂类型:
CREATE TABLE complex (
c1 ARRAY<INT>,
c2 MAP<STRING,INT>,
c3 STRUCT<a:STRING,b:INT,c:DOUBLE>,
c4 UNIONTYPE<STRING,INT>
);
通过下⾯的SELECT语句查询相应的数据:
SELECT c1[0] , c2['b'],c3.c , c4 FROM complex 结果类似:
1 2 1.0{1:63}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。