Hive数据类型与文件存储格式
2017-07-29 12:18 tlnshuju 阅读(4075) 评论(0) 编辑 收藏 举报Hive数据类型
基础数据类型:
TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP,DECIMAL,CHAR,VARCHAR,DATE。
复杂数据类型:
包括ARRAY,MAP,STRUCT,UNION。这些复杂类型是由基础类型组成的。
ARRAY:ARRAY类型是由一系列同样数据类型元素组成的,这些元素能够通过下标来訪问。比方有一个ARRAY类型的变量fruits。它是由[‘apple’,’orange’,’mango’]组成,那么能够通过fruits[1]来訪问orange;
MAP:MAP包括key->value键值对。能够通过key来訪问元素。比方”userlist”是一个map类型(当中username是key。password是value),那么我们能够通过userlist[‘username’]来得到这个用户相应的password;
STRUCT:STRUCT能够包括不同数据类型的元素。
这些元素能够通过点的方式来得到,比方user是一个STRUCT类型,那么能够通过user.address得到这个用户的地址。
UNION: UNIONTYPE
基本类型转换
注:因为表格比較大。这里对一些比較长的字符串进行缩写,ts是timestamp的缩写,bl是boolean的缩写,sl是smallint的缩写,dm是decimal的缩写,vc是varchar的缩写,ba是binary的缩写。
Hive文件格式
文件格式
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 阶段的排序过程。
Rcfile:
RCFile是Hive推出的一种专门面向列的数据格式。
它遵循“先按列划分。再垂直划分”的设计理念。
当查询过程中,针对它并不关心的列时,它会在IO上跳过这些列。须要说明的是。RCFile在map阶段从远端拷贝仍然是拷贝整个数据块,而且复制到本地文件夹后,RCFile并非真正直接跳过不须要的列,并跳到须要读取的列, 而是通过扫描每个row group的头部定义来实现的。
可是在整个HDFS Block 级别的头部并未定义每个列从哪个row group起始到哪个row group结束。所以在读取全部列的情况下。RCFile的性能反而没有SequenceFile高。
行存储、列存储以及RCFile方式存储
行存储
HDFS块内行存储的样例
基于Hadoop系统行存储结构的长处在于高速数据载入和动态负载的高适应能力,这是因为行存储保证了同样记录的全部域都在同一个集群节点,即同一个 HDFS块。
只是,行存储的缺点也是显而易见的。比如它不能支持高速查询处理,因为当查询只针对多列表中的少数几列时。它不能跳过不必要的列读取;此外,因为混合着不同数据值的列,行存储不易获得一个极高的压缩比,即空间利用率不易大幅提高。
列存储
HDFS块内列存储的样例
在HDFS上依照列组存储表格的样例。
在这个样例中。列A和列B存储在同一列组,而列C和列D分别存储在单独的列组。查询时列存储能够避免读不必要的列。 而且压缩一个列中的类似数据能够达到较高的压缩比。
然而,因为元组重构的较高开销,它并不能提供基于Hadoop系统的高速查询处理。列存储不能保证同一记录的全部域都存储在同一集群节点,行存储的样例中。记录的4个域存储在位于不同节点的3个HDFS块中。
因此,记录的重构将导致通过集群节点网络的大量传输数据。虽然预先分组后,多个列在一起能够降低开销,可是对于高度动态的负载模式。它并不具备非常好的适应性。
RCFile存储方式
HDFS块内RCFile存储的样例
RCFile结合行存储查询的高速和列存储节省空间的特点。
首先。RCFile保证同一行的数据位于同一节点。因此元组重构的开销非常低。其次,像列存储一样,RCFile能够利用列维度的数据压缩,而且能跳过不必要的列读取。
扩展接口
默认的文件读取方式
自己定义inputformat
自己定义serde