Hive 支持关系型数据库中的大多数基本数据类型,同时也支持关系型数据库中很少出现的3种集合数据类型,首先我们来介绍一下这些数据类型。
1、基本数据类型
数据类型 | 长度 |
---|---|
TINYINT | 1byte有符号整数 |
SMALLINT | 2byte有符号整数 |
INT | 4byte有符号整数 |
BIGINT | 8byte有符号整数 |
BOOLEAN | 布尔类型 |
FLOAT | 单精度浮点数 |
DOUBLE | 双精度浮点数 |
STRING | 字符序列,可以指定字符集,可以使用单引号或者双引号 |
TIMESTAMP | 整数、浮点数或者字符串 |
BINARY | 字节数组 |
需要注意的是,所有的上述数据类型都是对JAVA接口的实现,因此这些类型的具体行为细节和Java当中对应的类型是完全一致的。例如STRING类型实现的是java中的String,FLOAT实现的是Java中的float等等。
新增数据类型TIMESTAMP的值可以是整数,也就是距离Unix新纪元时间(1970年1月1日,午夜12点)的秒数,也可以是浮点数,即距离UNIX新纪元时间的秒数,精确到纳秒(小数点后保留9位数);还可以是字符串,即JDBC所约定的时间字符串格式,格式为YYYY-MM-DD hh:mm:ss.fffffffff.
TIMESTAMPS表示的是UTC时间。Hive本身提供了不同时区互相转换的内置函数,也就是to_utc_timestamp函数和from_tuc_timestamp函数。
如果用户在查询中将一个float类型的列和一个double类型的列做对比或者将一种整型类型和另一种整型类型的值做对比,那么结果将会怎样呢?Hive会隐式地将类型转换为两个整形类型种值较大的那个类型,也就是会将float转换为double类型,而且如有必要,也会将任意的整形类型转换为double类型,因此事实上是同类型之间的比较。
如果用户希望将一个字符串类型的列转换为数值呢?这种情况下用户可以显式地将一种数据类型转换为其他一种数据类型,使用cast函数即可。
2、集合数据类型
Hive中的列支持使用struct,map和array集合数据类型:
数据类型 | 描述 | 示例 |
---|---|---|
STRUCT | 和c语言中的struct或者‘对象’类似,都可以通过点符号访问元素内容,例如某个列的数据类型是STRUCT{first STRING,last STRING},那么第一个元素可以通过字段名.first来引用。 | struct('John','Doe') |
MAP | MAP是一组键值对元素集合,使用数组表示法可以访问元素,例如,某个列的数据类型是MAP,其中键值对是'first'->'John' 和 'last' -> 'Doe',那么可以通过字段名['last']获取最后一个元素 | map('first','JOIN','last','Doe' |
ARRAY | 数组是一组具有相同类型和名称的变量的集合,这些变量称为数组的元素,每个数组元素都有一个编号,编号从0开始 | Array('John','Doe') |
这里有一个用于演示如何使用这些数据类型的表结构声明语句,这是一张虚构的人力资源应用程序中的员工表:
CREATE TABLE IF NOT EXIST employees(
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING, city:STRING,state:STRING,zip:INT>
)
其中,那么是一个简单的字符串,对于大多数雇员来说,salary使用float浮点数类型来表示己经足够了。subordinates(下属员工)列表是一个字符串值数组。字段deductions是一个由键值对构成的map,其记录了每一次的扣除额,这些钱将会在发薪水的时候从员工工资中扣除。map中的键时扣除金额项目的名称,值可以是一个百分比值,也可以完全就是一个数值。最后,每名雇员的家庭住址使用struct数据类型存储,其中的每个域都被作了命名,并且具有一个特定的数据类型。