Parquet & ORC | 青训营笔记

102 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第13天

总览

  1. 列式存储和行式存储的区别
  2. Parquet 列存格式的原理详解
  3. ORC 列存格式的原理详解,以及和Parquet 的对比
  4. 列存格式的演进

计算引擎解决不同场景

  • Spark 主要适用于批式查询场景
  • Flink 主要适用于流式处理场景
  • Presto 主要适用于交互式查询场景
  • Hive 作为 Hadoop 框架上最早的SQL数仓产品,内置了 Hive Metastore (HMS) 组件,计算引擎上支持 Map-Reduce、Tez以及 Spark。目前 HMS 依然作为大数据场景下使用最为广泛的元数据服务。

Parquet 详解

Parquet 数据文件布局

  • RowGroup: 每一个行组包含一定数量或者固定大小的行的集合,在 HDFS 上,RowGroup 大小建议配置成 HDFS Block 大小
  • ColumnChunk: RowGroup 中按照列切分成多个 ColumnChunk
  • Page:ColumnChunk内部继续切分成 Page,一般建议 8KB 大小。Page 是压缩和编码的基本单元

索引和排序 Index and Ordering

  • 和传统的数据库相比,索引支持非常简陋
  • 主要依赖 Min-Max Index 和 排序 来加速查找
  • Page:记录 Column 的 min_value 和 max_value
  • Footer 里的 Column Metadata 包含 ColumnChunk 的全部 Page 的 Min-Max Value
  • 一般建议和排序配合使用效果最佳
  • 一个 Parquet 文件只能定义一组 Sort Column,类似聚集索引概念

典型的查找过程:

  • 读取 Footer
  • 根据 Column 过滤条件,查找 Min-Max Index 定位到 Page
  • 根据 Page 的 Offset Index 定位具体的位置
  • 读取 Page,获取行号
  • 从其他 Column 读取剩下的数据

Parquet 中的压缩方式

  • Page 完成 Encoding 以后,进行压缩
  • 支持多种压缩算法
    • snappy: 压缩速度快,压缩比不高,适用于热数据
    • gzip:压缩速度慢,压缩比高,适用于冷数据
    • zstd:新引入的压缩算法,压缩比和 gzip 差不多,而且压缩速度略低于 Snappy

ORC 详解

\

参考链接:juejin.cn/post/712795… 来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。