这是我参与「第四届青训营 」笔记创作活动的第13天,在第十三节课中主要了解到了Parquet与ORC:高性能列式存储有关的内容。
一、列存vs行存
数据格式层概述
- 计算层:各种计算引擎
- 存储层:承载数据的持久化存储
- 数据格式层:定义了存储层文件内部的组织格式,计算引擎通过格式层的支持来读写文件
分层视角下的数据形态
- 存储层:File,Blocks
- 格式层:File内部的数据布局
- 计算引擎:Rows+Columes
两种数据查询分析场景:OLTP,OLAP
OLTP:行式存储格式
- 每行的数据在文件上使连续存储的
- 读取整行数据效率较高
- 同列的数据类型一致,压缩编码的效率更好 典型系统:
- 大数据分析系统:SQL-on-Hadoop,数据湖分析
- 数据仓库:ClickHouse,Greenplum,阿里云MaxCompute
二、Parquet原理详解
Parquet简介
- 大数据分析领域使用最广的列存格式
- Spark推荐存储格式
压缩Compression
- page完成Encoding以后,进行压缩
- 支持多种压缩算法
索引Index
- 和传统的数据库相比,索引支持非常简陋
- Min-Max Index:记录Page内部Column的min_value和max_value Bloom Filter 排序Ordering:
过滤下推Predicate PushDown
Spark集成-向量化读
- ParquetFileFormat
深入Dremel数据模型-Repetition Level
三、ORC详解
ORC简介
- 大数据分析领域使用最广的列存格式之一
- 出自于Hive项目
数据模型
- ORC会给包括根节点在内的中间节点都创建一个Colume
- 嵌套类型或者集合类型支持和Parquet差别较大
- optional和repeated字段依赖父节点记录额信利息来重新Assembly数据
数据布局
- 类似Parquet
ACID特性简介
- 支持Hive Transactions实现,目前只有Hive本身集成
- 类似Delta Lake/Hudi/iceberg