Hive探秘--文件格式与压缩格式

HIVE的几种文件格式
1、TEXTFILE
  文本格式,默认格式,数据不做压缩,磁盘开销大,数据解析开销大
  对应hive API为org.apache.hadoop.mapred.TextInputFormat和org.apache.hive.ql.io.HiveIgnoreKeyTextOutputFormat
  可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。
2、SequenceFile
  hadoop提供的二进制文件格式,hadoop支持的标准文件格式
  直接序列化到文件中,sequencefile文件不能直接查看,可以通过Hadoop fs -text查看
  具有使用方便,可分割、可压缩,可进行切片。压缩支持NONE,RECORD,BLOCK(优先),可进行切片
  对应hive API为:
  org.apache.hadoop.mapred.SequenceFileInputFormat和org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

3、rcfile
  大多数hadoop和hive存储是行式存储,在大多数环境下比较高效,因为大多数表具有的字段数不大,且文件按块压缩对于需要处理重复数据的情况比较高效,同时处理和调试工具(more、head、awk)都能很好的适应行式存储的数据。
  但当需要操作的表有成百上千个字段,而操作只有一小部分字段时,往往造成很大的浪费,此时若采用列存储只操作需要的列便可大大提高性能
  rcfile是一种行列存储相结合的存储方式,先将数据按行进行分块再按列式存储,保证同一条记录在一个块上,避免读取多个块,有利于数据压缩和快速进行列存储。
  对应的hive API为org.apache.hadoop.hive.ql.io.RCFileInputFormat和org.apache.hadoop.hive.ql.io.RCFileOutputFormat

行存储
  基于Hadoop系统行存储结构的有点是快速数据加载和动态负载的高适应能力,这是因为行存储保证了相同的数据域都在同一个集群节点,即同一个HDFS块。不过,行存储的缺点也是显而易见的,他不能支持快速查询处理,因为当查询仅针对多列表中的少数几列时,他不能跳过不必要的列读取;此外由于混合着不同数据值的列,行存储不易获得极高的压缩比,即空间利用率不易大幅提高。尽管通过熵解码和利用列相关性能够获得较好的压缩比,但是复杂数据存储实现会导致解压开销增大。

列式存储

列式存储和行式存储相比有哪些优势呢?
可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。
压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如Run Length Encoding和Delta Encoding)进一步节约存储空间。
只读取需要的列,支持向量运算,能够获取更好的扫描性能。

4、orcfile
orcfile是对rcfile的优化,可以提高hive的读写、数据处理性能,提供更高的压缩效率。
优点:
每个task只输出单个文件,减少namenode负载
支持各种复杂的数据类型,比如datetime,decimal以及复杂类型(struct,list,map,union)
文件中存储了一些轻量级的索引数据
基于数据类型的块模式压缩:integer类型的列用行程长度编码,String类型的列使用字典编码
用多个互相独立的recordReaders并行读相同的文件
无需扫描markers即可分割文件
绑定读写所需内存
metadata存储用protocol buffers,支持添加和删除列

5、自定义格式

若当前数据文件格式不能被当前hive所识别时,可以自定义文件格式,

用户可通过实现InputFormat和OutputFormat来自定义输入输出格式。

总结

textfile 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载
orcfile, rcfile存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低.
orcfile, rcfile较有优势,orcfile,rcfile具备相当于行存储的数据加载和负载适应能力,扫描表时避免不必要的列读取,
拥有比其他结构更好的性能,而使用列维度的压缩,能有效提升存储空间利用率。
但orcfile, rcfile数据加载是性能损失较大,但由于hdfs一次写入多次读写,所以损失可以接受。
SequenceFile,ORCFile(ORC),rcfile格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中,
然后再从textfile表中导入到SequenceFile,ORCFile(ORC),rcfile表中。

压缩格式

参考文档:文件格式  http://www.2cto.com/database/201605/506775.html

     文件格式与压缩: http://blog.csdn.net/houzhizhen/article/details/53097106

 

posted @ 2017-08-17 17:05  AlgorithmInit  阅读(3557)  评论(0编辑  收藏  举报