hive数据类型
hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括array,map,struct和union。原始数据类型如下:
类型名称 | 大小 | 备注 |
---|---|---|
tinyint | 1字节整数 | 45Y |
smallint | 2字节整数 | 12S |
int | 4字节整数 | 10 |
bigint | 8字节整数 | 244L |
float | 4字节单精度浮点数 | 1.0 |
double | 8字节单精度浮点数 | 1.0 |
decimal | 任意精度带符号小数 | decimal(4,2)范围:-99.99到99.99 |
boolean | true/false | true |
string | 字符串,长度不定 | “ab”,‘b’ |
varchar | 字符串,长度不定,有上限 | |
char | 字符串,固定长度 | “ab”,‘b’ |
binary | 存储边长的二进制数据 | |
timestamp | 时间戳,纳秒精度 | 122327493795 |
date | 日期 | ‘2016-07-03’ |
复杂类型如下:
类型名称 | 大小 | 实例 |
---|---|---|
array | 存储同类型数据 | array<date_type> |
map | key-value,key必须为原始类型,value可以是任意类型 | map<primitive_type,data_type> |
struct | 类型可以不同 | struct<col_name:data_type> |
union | 在有限取值范围内的一个值 | uniontype<date_type,data_type,…> |
hive存储格式
hive支持的存储格式包括TextFile、SequenceFile、RCFile、Avro Files、ORC Files、Parquet。
TextFile:
Hive默认格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2、Snappy等使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。
SequenceFile:
SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以<key,value>的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程。
SequenceFile的文件结构图:
Block-Compressed SequenceFile格式:
RCFile:
RCFile是Hive推出的一种专门面向列的数据格式。 它遵循“先按列划分,再垂直划分”的设计理念。当查询过程中,针对它并不关心的列时,它会在IO上跳过这些列。需要说明的是,RCFile在map阶段从 远端拷贝仍然是拷贝整个数据块,并且拷贝到本地目录后RCFile并不是真正直接跳过不需要的列,并跳到需要读取的列, 而是通过扫描每一个row group的头部定义来实现的,但是在整个HDFS Block 级别的头部并没有定义每个列从哪个row group起始到哪个row group结束。所以在读取所有列的情况下,RCFile的性能反而没有SequenceFile高。