1. 基本数据类型
Hive支持多种不同长度的整型和浮点数据类型,支持布尔类型,也支持无长度限制的字段串类型。Hive v0.8.0版本中增加了时间戳数据类型和二进制数组数据类型。
下表中列举了Hive所支持的基本数据类型:
数据类型 | 长度 | 例子 |
---|---|---|
TINYINT | 1byte有符号整数 | 20 |
SMALINT | 2byte有符号整数 | 20 |
INT | 4byte有符号整数 | 20 |
BIGINT | 8byte有符号整数 | 20 |
BOOLEAN | 布尔类型,true或者false | TRUE |
FLOAT | 单精度浮点数 | 3.14159 |
DOUBLE | 双精度浮点数 | 3.14159 |
STRING | 字符序列。可以指定字符集。可以使用单引号或者双引号 | ‘now is the time’,“for all good mean” |
TIMESTAMP(v0.8.0+) | 整数,浮点数或者字符串 | 1327882394(Unix新纪元秒), 1327882394.123456789(Unix新纪元秒并跟随有纳秒数)和’2019-12-31 15:43:50.123456789‘(JDBC所兼容的java.sql.Timestamp时间格式) |
BINARY(v0.8.0+) | 字节数组 | 后面的讨论 |
需要注意的是,所有这些数据类型都是对Java中的接口的实现,因此这些类型的具体行为细节和Java中对应的类型是完全一致的。例如,STRING类型实现的是Java中的String,FLOAT实现的是Java中的float,等等。
在其他SQL方言中,通常会提供最大长度的“字符数组”(也就是很多字符串)类型,但是需要注意的是Hive中不支持这种数据类型。关系型数据库提供这个功能是出于性能优化的考虑。因为定长的记录更容易进行建立索引,数据扫描,等等。在Hive中不一定拥有数据文件但必须能够支持使用不同的文件格式,Hive根据不同字段间的分隔符来对其进行判断。同事,Hadoop和Hive强调优化磁盘的读和写性能,而限制列的长度相对来说并不重要。
2. 集合数据类型
Hive中的列支持使用struct,map 和 array集合数据类型。下表中的语法示例实际上调用的是内置函数。
这种格式在传统数据库模型中会需要使用不同的拼装而成,表间需要适当使用外键进行连接(也可不使用),破坏标准格式所带来的一个实际问题是会增大数据冗余的风险,进而导致消耗不必要的磁盘空间,还有可能会造成数据不一致(在数据发生改变时冗余的拷贝数据可能无法进行相应的同步)。
然而在大数据系统中,不遵循标准格式的一个好处就是可以提供更高吞吐量的数据。当处理的数据的数量级是T或者P时,以最少的“头部寻址”来从磁盘上扫描数据是非常必要的。按数据集进行封装的话可以通过减少寻址次数来提供插叙的速度。
通过关联关系来寻址的话,会有非常高的性能消耗
3.文本文件数据编码
我们一般熟悉以逗号(CSV)或者制表符来分割文本(TSV),下表是Hive提供的其他的分隔符。
分隔符 | 描述 |
---|---|
\n | 对于文本文件来说吗,每行都是一条记录,因此换行符可以分割记录 |
^A(Ctrl+A) | 用于分割字段(列)。在CREATE TABLE语句中可以使用八进制编码\001表示 |
^B | 用于分割ARRAY或者STRUCT中的元素,或用于MAP中键-值对之间的分隔。在CREATE TABLE语句中可以使用八进制编码\002表示 |
^C | 用于MAP中键和值之间的分隔。在CREATE TABLE语句中可以使用八进制编码\003表示 |
例如:
John Doe^A100000.0^AMary Smith^BTodd Jones^AFederal Taxes^C.2^BStateTaxes^C.05^BInsurance^C.1^A1 Michigan Ave.^BChicago^BIL^B60600
上面的数据可读性并不好,如果使用JavaScript数据交换格式(JSON)来表示这条记录的话(增加了额表中的字段名称),如下:
如果使用Hive话可以建立如下表并制定分隔符来关联文件中的数据:
CREATE TABLE employee(
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;