Hive支持的数据类型
Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括array,map,struct,union。
一,原始数据类型
类型名称大小示例TINYINT1字节整数45YSMALLINT2字节整数12SINT4字节整数10BIGINT8字节整数244LFLOAT4字节单精度浮点数1.0DOUBLE8字节双精度浮点数1.0DECIMAL任意精度带符号小数DECIMAL(4, 2)范围:-99.99到99.99BOOLEANtrue/falseTRUESTRING字符串,长度不定“a”, ‘b’VARCHAR字符串,长度不定,有上限“a”, ‘b’CHAR字符串,固定长度“a”, ‘b’BINARY存储变长的二进制数据 TIMESTAMP时间戳,纳秒精度122327493795DATE日期‘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>MAPkey-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开始。例如:
- CREATE TABLE union_test(u UNIONTYPE<int, double, array<string>,struct<a:int,b:string>>);
- SELECT u 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}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
在该例子中,union包含四种类型,分别为int、double、array和struct。从查询结果来看,第一个冒号前面的数字代表union中某种数据类型,比如0代表union的第一个数据类型int,1代表第二个数据类型double,以此类推。