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不需要设置 |