hive表的源文件存储格式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leprovision/article/details/83035793

Hive文件存储格式
1.textfile
textfile为默认格式
存储方式:行存储
磁盘开销大 数据解析开销大,压缩的text文件 hive无法进行合并和拆分
(建表时不指定它会默认为这个格式,导入数据时会直接把数据文件拷贝到HDFS上不进行处理,源文件可以直接通过hadoop fs -cat 查看。)

2.sequencefile
二进制文件,以<key,value>的形式序列化到文件中
存储方式:行存储,可分割 压缩,一般选择block压缩
优势是文件和Hadoop api中的mapfile是相互兼容的。

(sequencefile这是一种Hadoop API提供的二进制的文件使用方便)
3.rcfile
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取,读记录尽量涉及到的block最少,读取需要的列只需要读取每个row group 的头部定义。读取全量数据的操作 性能可能比sequencefile没有明显的优势

(rcfile存储数据首先将其数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block,其次块数据列式存储有利于数据压缩和快速的列存取,理论上具有高查询效率)

4.orc

存储方式:数据按行分块 每块按照列存储,压缩快 快速列存取,效率比rcfile高,是rcfile的改良版本

5.自定义格
用户可以通过实现inputformat和 outputformat来自定义输入输出格式。

Apache Parquet
源自于google Dremel系统(可下载论文参阅),Parquet相当于Google Dremel中的数据存储引擎,而Apache顶级开源项目Drill正是Dremel的开源实现。
Apache Parquet 最初的设计动机是存储嵌套式数据,比如Protocolbuffer,thrift,json等,将这类数据存储成列式格式,以方便对其高效压缩和编码,且使用更少的IO操作取出需要的数据,这也是Parquet相比于ORC的优势,它能够透明地将Protobuf和thrift类型的数据进行列式存储,在Protobuf和thrift被广泛使用的今天,与parquet进行集成,是一件非容易和自然的事情。 除了上述优势外,相比于ORC, Parquet没有太多其他可圈可点的地方,比如它不支持update操作(数据写成后不可修改),不支持ACID等。

Apache ORC
ORC(OptimizedRC File)存储源自于RC(RecordColumnar File)这种存储格式,RC是一种列式存储引擎,对schema演化(修改schema需要重新生成数据)支持较差,而ORC是对RC改进,但它仍对schema演化支持较差,主要是在压缩编码,查询性能方面做了优化。RC/ORC最初是在Hive中得到使用,最后发展势头不错,独立成一个单独的项目。Hive 1.x版本对事务和update操作的支持,便是基于ORC实现的(其他存储格式暂不支持)。ORC发展到今天,已经具备一些非常高级的feature,比如支持update操作,支持ACID,支持struct,array复杂类型。你可以使用复杂类型构建一个类似于parquet的嵌套式数据架构,但当层数非常多时,写起来非常麻烦和复杂,而parquet提供的schema表达方式更容易表示出多级嵌套的数据类型。


总结:
textfile 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载
rcfile 存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低

相比传统的行式存储引擎,列式存储引擎具有更高的压缩比,更少的IO操作而备受青睐(注:列式存储不是万能高效的,很多场景下行式存储仍更加高效),尤其是在数据列(column)数很多,但每次操作仅针对若干列的情景,列式存储引擎的性价比更高。

在互联网大数据应用场景下,大部分情况下,数据量很大且数据字段数目很多,但每次查询数据只针对其中的少数几行,这时候列式存储是极佳的选择

猜你喜欢

转载自blog.csdn.net/leprovision/article/details/83035793