hive优化-存储格式

Hive中的文件格式大致上分为面向行和面向列两类:

面向行:同一行的数据存储在一起,即连续存储。TextFile,SequenceFile。采用这种方式,如果只需要访问行的一小部分数据,亦需要将整行读入内存,推迟序列化一定程度上可以缓解这个问题,但是从磁盘读取整行数据的开销却无法避免。面向行的存储适合于整行数据需要同时处理的情况。
面向列:整个文件被切割为若干列数据,每一列数据一起存储。 RCFile,ORCFile。面向列的格式使得读取数据时,可以跳过不需要的列,适合于只处于行的一小部分字段的情况。但是这种格式的读写需要更多的内存空间,因为需要缓存行在内存中(为了获取多行中的某一列)。

textFile

这里写图片描述
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,
从而无法对数据进行并行操作。

SequenceFile

根据是否压缩,以及采用记录压缩还是块压缩,存储格式有所不同:
这里写图片描述

这里写图片描述
这里写图片描述
不压缩:
按照记录长度、Key长度、Value程度、Key值、Value值依次存储。长度是指字节数。采用指定的Serialization进行序列化。

Record压缩:
只有value被压缩,压缩的codec保存在Header中。

Block压缩:
多条记录被压缩在一起,可以利用记录之间的相似性,更节省空间。Block前后都加入了同步标识,一般建议使用BLOCK压缩。Block的最小值由io.seqfile.compress.blocksize属性设置。

RcFile

这里写图片描述
RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取

OrcFile

这里写图片描述
OrcFile(Optimized Record Columnar File)提供了一种比RCFile更加高效的文件格式。其内部将数据划分为默认大小为250M的Stripe。每个Stripe包括索引、数据和Footer。索引存储每一列的最大最小值,以及列中每一行的位置。

多种存储格式对比

压缩格式 文件大小 查询时间(指定条件统计) 压缩类型 分割 参数
textFile 618.4 G 186.1s
textFile_gz 128.0 G 76.8s gz set hive.exec.compress.output=true;set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
sequenceFile-block_gz 132.7 G 79.8s block set hive.exec.compress.output=true;set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;SET mapred.output.compression.type=BLOCK;
rcFile_gz 130.2 G 84.7s gz set hive.exec.compress.output=true;set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
orcFile 271.2 G 66.5s 需要在建表语句中添加:stored as ORC tblproperties (“orc.compress”=”NONE”);
orcFile_zlib 123.3 G 46.9s(无索引)/40.7s(有索引) zlib 默认为zlib不需要设置

猜你喜欢

转载自blog.csdn.net/u010010664/article/details/79926676