文件存储格式

hive支持的文件存储格式主要textFile , sequenceFile ,orc , parquet file ,text file 和 sequencefile 都是基于行式存储的 。
orc 和 parquet file 是列式存储存储的 , 可以针对性的设计更好的压缩算法。
hive文件存储格式

列式存储之parquet

hive文件存储格式 一. parquet的 文件的格式和架构
parquet文件是一个二进制的文件 , 不可直接读取 , 因为其包含元数据 和 原始数据 , 所以是自解析的
1.行组( row group )
每一个行组包括一定的行数, 是一个hdfs的具体文件 , 类似是一个orc文件的stripe,存储了一定行数的一个文件
2 列块 ( column group)
每一个行组的所有信息存储在一个列块中
每一个行组的每一个列块的所有数据的类型都是相同的不同的列块可能使用不同压缩方式进行压缩。
3 页 ( page)
每一个列块可以分成多个页, 每一个页是最小的压缩和存储的单元 , 每一个页可以使用不同的压缩算法、 编码方式的 压缩


4 其他信息
上图展示了一个parquet文件的内容 , 一个文件可以存储多个行组 , 每一个文件的首位是一个magic code, 用来校验他是不是一个parquet文件 , foooterlength 记录了数据的原始文件的大小,通过改值可以计算出文件的大小和偏移量
在每一个page中也保留了文件的大小和偏移量信息 , 每隔页都会存储相关的元数据信息 。 parquet的页分三种 :
1) 数据页
存储当前的行组中数据的值
2) 字典页
存储该页面的编码字典 ,每一个列块都会包含一个字典页面
3) 索引页
用来存储发当前行组下该列的索引

列式存储之orc格式

hive文件存储格式由上图可以看到 , 一个orc 文件由多个stripe 构成 ,每一个stripe 分为三部分(index Data | Row data | Stripe footer 来构成)
1 index data
记录 一个轻量级的元数据信息 ,存储某行的某一个字段在数据中的原始数据的信息 ,默认每1w 行做一次的数据的索引信息
2 Row data
存储原始的数据信息 : 取部分行(一个stripe的数据),取该数据对其按照列使用stream的方式进行存储
3 stripe footer

  • file footer : 存储的是每隔stripe的函数 ,每一个column的数据类型信息等;
  • Postscripts : 记录了整个文件的压缩类型 , 一级fileFooter的长度信息等
  • 当读取文件时 ,先查找道每一个文件的post stripe 的信息 ,获得file footer的信息 ,再读取每一个stripe的信息

存储文件的压缩比总结:
ORC > Parquet > textFile
存储文件的查询速度总结:查询速度相近。

snappy 压缩

优点: 支持合理的 压缩速率 和合理的压缩率,不支持 split, 是spark的默认的压缩方式,hadoop原生不支持

TextFile格式

默认格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用,但使用Gzip这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。

Gzip

linux 原生支持 ,hadoop原生支持 ,不支持split ,文件在130M 以内都可以考虑使用Gzip

相关文章: