「Hive进阶篇」详解存储格式及压缩方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「Hive进阶篇」详解存储格式及压缩方式相关的知识,希望对你有一定的参考价值。
参考技术A hive优化除了有hql语句逻辑优化,hql参数调优等等,还有一个不起眼的细节容易被忽视掉, 那便是hive数仓模型表的存储格式和压缩方式 ,hive底层数据是依托在hadoop,以HDFS文件存储在集群上的, hive数仓模型表选择一个合适的存储格式和压缩方式也是hive优化的一点 。
本篇就来聊一聊这块知识点吧。😄
hive主要有textfile、sequencefile、orc、parquet 这四种存储格式,其中sequencefile很少使用,常见的主要就是orc和parquet这两种,往往也搭配着压缩方式合理使用。
建表声明语句是: stored as textfile/orc/parquet
行式存储,这是hive表的默认存储格式,默认不做数据压缩,磁盘开销大,数据解析开销大,数据不支持分片(即代表着会带来无法对数据进行并行操作)
行列式存储,将数据按行分块,每个块按列存储,其中每个块都存储着一个索引,支持none和zlib和snappy这3种压缩方式,默认采用zlib压缩方式,不支持切片,orc存储格式能提高hive表的读取写入和处理的性能。
列式存储,是一个面向列的二进制文件格式(不可直接读取),文件中包含数据和元数据,所以该存储格式是自解析的,在大型查询时效率很快高效,parquet主要用在存储多层嵌套式数据上提供良好的性能支持,默认采用uncompressed不压缩方式。
行存储引擎 :同一条数据的不同字段都在相邻位置,所以当要查找某一条记录所有数据时行存储查询速度比较快
列存储引擎 :以列来聚集数据,相同字段的值聚集在一起,所以当查询某一个指定列的所有数据时,列存储查询速度比较快
hive主要支持gzip、zlib、snappy、lzo 这四种压缩方式。
压缩不会改变元数据的分割性,即压缩后原来的值不变。
建表声明语句是: tblproperties("orc.compress"="SNAPPY")
压缩方式的评判标准主要有以下几点:
针对压缩方式做一个小结对比:
Hive表的几种存储格式
Hive的文件存储格式:
- textFile
textFile为默认格式
存储方式:行存储
缺点:磁盘开销大;数据解析开销大;压缩的text文件,hive无法进行合并和拆分
- sequencefile
二进制文件,以<key,value>的形式序列化到文件中
存储方式:行存储
优点:可分割、压缩,一般选择block压缩,与hadoop api中的mapfile是互相兼容的。
- Rcfile
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
读记录尽量涉及到的block最少
读取需要的列只需要读取每个row group 的头部定义。
读取全量数据的操作 性能可能比sequencefile没有明显的优势
- ORC
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
效率比rcfile高,是rcfile的改良版本
官网介绍:
The Optimized Row Columnar (ORC) file format provides a highly efficient way to store Hive data. It was designed to overcome limitations of the other Hive file formats. Using ORC files improves performance when Hive is reading, writing, and processing data.
ORC实际上是在RC文件存储格式做了一些优化,它的主要优点有:
(1)、每个task只输出单个文件,这样可以减少NameNode的负载;
(2)、支持各种复杂的数据类型,比如: datetime, decimal, 以及一些复杂类型(struct, list, map, and union);
(3)、在文件中存储了一些轻量级的索引数据;
(4)、基于数据类型的块模式压缩:a、integer类型的列用行程长度编码(run-length encoding);b、String类型的列用字典编码(dictionary encoding);
(5)、用多个互相独立的RecordReaders并行读相同的文件;
(6)、无需扫描markers就可以分割文件;
(7)、绑定读写所需要的内存;
(8)、metadata的存储是用 Protocol Buffers的,所以它支持添加和删除一些列。
- 自定义格式
用户可以通过实现inoutformat和outputformat来定义输入输出格式。
以上是关于「Hive进阶篇」详解存储格式及压缩方式的主要内容,如果未能解决你的问题,请参考以下文章