《Hive权威指南》第三章:数据类型与文件格式

1. 基本数据类型

Hive支持多种不同长度的整型和浮点数据类型,支持布尔类型,也支持无长度限制的字段串类型。Hive v0.8.0版本中增加了时间戳数据类型和二进制数组数据类型。

下表中列举了Hive所支持的基本数据类型:

数据类型长度例子
TINYINT1byte有符号整数20
SMALINT2byte有符号整数20
INT4byte有符号整数20
BIGINT8byte有符号整数20
BOOLEAN布尔类型,true或者falseTRUE
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;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值