数据仓库Hive编程——数据类型和文件格式(一):基本数据类型

分类目录:商业智能《数据仓库Hive编程》总目录

相关文章:
数据类型和文件格式(一):基本数据类型
数据类型和文件格式(二):集合数据类型
数据类型和文件格式(三):文本文件数据编码
数据类型和文件格式(四):读时模式

Hive支持关系型数据库中的大多数基本数据类型,同时也支持关系型数据库中很少出现的3种集合数据类型,

其中一个需要考虑的因素就是这些数据类型是如何在文本文件中进行表示的,同时还要考虑文本存储中为了解决各种性能问题以及其他问题有哪些替代方案。和大多数的数据库相比,Hive具有一个独特的功能,那就是其对于数据在文件中的编码方式具有非常大的灵活性。大多数的数据库对数据具有完全的控制,这种控制既包括对数据存储到磁盘的过程的控制,也包括对数据生命周期的控制。Hive将这些方面的控制权转交给用户,以便更加容易地使用各种各样的工具来管理和处理数据。

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

数据类型 长度 例子
TINYINT 1byte有符号整数 20
SMALINT 2byte有符号整数 20
INT 4byte有符号整数 20
BIGINT 8byte有符号整数 20
BOOLEAN 布尔类型 TRUE
FLOAT 单精度浮点数 3.14159
DOUBLE 双精度浮点数 3.14159
STRING 字符序列 ‘hy592070616’
TIMESTAMP 整数/浮点数/字符串 ‘2019-01-01 00:00:00.000000000’
BINARY 字节数组 -

和其他SQL方言一样,这些都是保留字。需要注意的是所有的这些数据类型都是对Java中的接口的实现,因此这些类型的具体行为细节和Java中对应的类型是完全一致的。例如,STRING类型实现的是Java中的StringFLOAT实现的是Java中的float等等。

在其他SQL方言中,通常会提供限制最大长度的“字符数组”类型,但需要注意的是Hive中不支持这种数据类型。关系型数据库提供这个功能是出于性能优化的考虑。因为定长的记录更容易进行建立索引,数据扫描等等。在Hive所处的“宽松”的世界里,不一定拥有数据文件但必须能够支持使用不同的文件格式,Hive根据不同字段间的分隔符来对其进行判断。同时,Hadoop和Hive强调优化磁盘的读和写的性能,而限制列的值的长度相对来说并不重要。

新增数据类型TIMESTAMP的值可以是整数,也就是距离Unix新纪元时间(1970年1月1日,午夜12点)的秒数;也可以是浮点数,即距离Unix新纪元时间的秒数,精确到纳秒(小数点后保留9位数);还可以是字符串,即JDBC所约定的时间字符串格式,格式为YYYY-MM-DD hh:mm:ss.fffffffffTIMESTAMPS表示的是UTC时间。Hive本身提供了不同时区间互相转换的内置函数,也就是to_utc_timestamp函数和from_utc_timestamp函数。

BINARY数据类型和很多关系型数据库中的VARBINARY数据类型是类似的,但其和BLOB数据类型并不相同。因为BINARY的列是存储在记录中的,而BLOB则不同。BINARY可以在记录中包含任意字节,这样可以防止Hive尝试将其作为数字,字符串等进行解析。需要注意的是如果用户的目标是省略掉每行记录的尾部的话,那么是无需使用BINARY数据类型的。如果一个表的表结构指定的是3列,而实际数据文件每行记录包含有5个字段的话,那么在Hive中最后2列数据将会被省略掉。

如果用户在查询中将一个float类型的列和一个double类型的列作对比或者将一种整型类型的值和另一种整型类型的值做对比,那么Hive会隐式地将类型转换为两个整型类型中值较大的那个类型,也就是会将FLOAT类型转换为DOUBLE类型,而且如有必要,也会将任意的整型类型转换为DOUBLE类型,因此事实上是同类型之间的比较。

如果用户希望将一个字符串类型的列转换为数值,那么用户可以显式地将一种数据类型转换为其他一种数据类型,:

cast(s AS INT) 

这里需要说明的是,AS INT是关键字,因此使用小写也是可以的。

你可能感兴趣的:(数据仓库Hive编程)