大数据列式存储的精髓:按列缓存打包


大数据列式存储的精髓:按列缓存打包

最具代表的大数据文件存储类型,Parquet和ORC

Parquet

Parquet 在每一列内也需要分成一个个的数据包,这个数据包就叫 Page,Page 的分割标准可以按数据点数(如每1000行数据打成一个 Page),也可以按空间占用(如每列的数据攒到8KB合成一个 Page)。
一个 Page 的数据就是一列,类型相同,在存储到磁盘之前一般都会进行编码压缩,为了快速查询、也为了解压缩这一个 Page,在写的时候先统计一下最大最小值,叫做 PageHeader,存储在 Page 的开头,其实就是 Page 的 元数据(metadata)。
PageHeader 后边就是数据了,读取一个 Page 时,可以先通过 PageHeader 进行过滤。
Parquet 又把多个 Page 放在一起存储,叫 Column Chunk。
于是,每一列都由多个 Column Chunk 组成,并且也有其对应的 ColumnChunk Metadata。
注意,这只是一个完整数据的一个属性,一个数据的多个属性要放在多个 Column Chunk 的,这多个 Column Chunk 放在一起就叫做一个 Row Group。

ORC

ORC 文件呢,换了个名字叫Stripe,不叫page了。
每个Stripe都包含index data、row data以及stripe footer。
Stripe footer包含流位置的目录;Row data在表扫描的时候会用到。
Index data包含每列的最大和最小值以及每列所在的行。
行索引里面提供了偏移量,它可以跳到正确的压缩块位置。
具有相对频繁的行索引,使得在stripe中快速读取的过程中可以跳过很多行,尽管这个stripe的大小很大。
在默认情况下,最大可以跳过10000行。
拥有通过过滤谓词而跳过大量的行的能力,你可以在表的 secondary keys 进行排序,从而可以大幅减少执行时间。
比如你的表的主分区是交易日期,那么你可以对次分区(state、zip code以及last name)进行排序。

总结

所以当我们知道了列存储的数据结构,就发现了优点:
1.查询时只有用到的列才会被扫描

  1. 同列的数据结构类型一致,方便数据压缩

但是不适合频率较高的删除(全列检索)、更新(重新压缩)操作,所以大部分数据组件不支持即席更新操作的原因其实也在本生的文件存储类型这


文章作者: Callable
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Callable !
评论
  目录