hive优化除了有hql语句逻辑优化,hql参数调优等等,还有一个不起眼的细节容易被忽视掉,那便是hive数仓模型表的存储格式和压缩方式,hive底层数据是依托在hadoop,以HDFS文件存储在集群上的,hive数仓模型表选择一个合适的存储格式和压缩方式也是hive优化的一点。
本篇就来聊一聊这块知识点吧。
通过大纲提问式进行概览,你能通过文章学到什么:
1. hive主要有几种存储格式&压缩方式
2. 每种存储格式和压缩方式的细节
3. 什么场景使用什么存储格式&压缩方式
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")
压缩方式的评判标准主要有以下几点:
针对压缩方式做一个小结对比:
适场景而选定压缩方式
适场景而选定存储格式