在数据工程的世界中,数据格式的选择如同选择一把合适的工具,直接关系到工作效率和数据处理的灵活性。经过八个小时的学习,我决定深入了解 Apache Parquet 这一文件格式。本文将结合我所学到的知识,带您走进 Parquet 的内部构造与其读写协议。
📊 数据存储的挑战
在处理大规模数据集时,数据的结构决定了存储和访问的效率。传统的行存储格式将数据按记录依次存储,就像一个数据库表的排列方式。这种格式在频繁访问整条记录时非常直观且有效。然而,当我们进行分析时,常常只需要从数百万行中提取几个特定的列。例如,假设我们有一个包含 50 列的大表,如果我们只对其中 3 列感兴趣,行存储格式仍然需要读取所有 50 列的数据,这无疑增加了不必要的开销。
相对而言,列存储格式通过按列存储数据,解决了这个问题。当需要特定列时,可以仅读取需要的数据,从而显著减少扫描的数据量。然而,简单地将数据存储在列中也有其缺点:写入或更新记录时需要接触多个列段,导致大量的 I/O 操作,尤其在处理大数据集时,写入性能可能大幅下降。
🔄 混合格式的优势
为了结合行存储和列存储的优点,Parquet 采用了一种混合格式。它将数据分组为“行组”,每个行组包含一部分行。在每个行组内,数据被称为“列块”,确保在磁盘上连续存储。在许多人的印象中,Parquet 似乎是纯粹的列存储格式,但实际上它在幕后组织了混合格式的数据结构。这种独特的设计使得 Parquet 在读取和写入方面都表现出色。
🏗️ Parquet 文件结构解析
元数据与术语
一个 Parquet 文件由多个核心部分组成:
- 行组(Row Groups):每个行组包含数据集中的一部分行,数据在行组内按列组织。
- 列块(Column Chunk):列块是在特定行组内某一列的数据。
- 页面(Pages):列块进一步细分为页面,这是 Parquet 中最小的数据单元,包含数据页面、字典页面和索引页面等多种类型。
关键元数据
Parquet 文件的元数据是其重要部分,包含以下信息:
- 魔数(Magic Number):位于文件开头和结尾的字节序列(PAR1),用于验证文件的有效性。
- 文件元数据(FileMetadata):存储在文件尾部,包含行数、数据模式和行组元数据等信息。
- 页面头(PageHeader):存储在页面数据中,包含值编码、定义编码和重复编码等信息。
✍️ Parquet 数据的写入与读取
数据写入过程
在 Parquet 中,数据写入由“Parquet Writer”负责。写入过程的概述如下:
- 应用程序发出写入请求,包含数据、压缩方案、编码方案等参数。
- Parquet Writer 收集信息并记录在文件元数据中。
- 写入魔数,计算行组数量并开始物理写入。
- 对于每个行组,迭代列列表并逐列写入。
- 每个列块按页面逐一写入,完成后构建列块元数据。
数据读取过程
读取过程则由“Parquet Reader”完成,步骤如下:
- 应用程序发出读取请求,包含输入文件、过滤器及所需列的集合。
- Reader 验证魔数,读取文件元数据。
- 过滤行组,定义列列表。
- 逐行组读取数据,直到所有行组被处理完毕。
📁 多文件与并行处理的优势
Parquet 文件的灵活性体现在可以将数据输出为多个文件,甚至可以按照特定标准进行分区。这使得在读取时可以利用多线程技术,提高效率。同时,单个 Parquet 文件在行组和列块的划分上允许并行读取,从而更好地利用系统资源。
🗜️ 编码技术的运用
Parquet 采用字典编码和游程编码(RLE)等技术,显著减少存储空间。字典编码通过用短的唯一键替换重复值,提升压缩率;而 RLE 则通过记录连续相同值的出现次数来进一步压缩数据。这种高效的编码方法,使得 Parquet 在处理大数据时表现出色。
🔍 OLAP 工作负载的优化
在分析工作负载中,利用统计信息过滤行组并选择所需列读取的能力,大幅提升了查询的效率。通过这样的布局,我们只需关注特定的行组和列,大大减少了数据扫描的工作量。
📝 结语
我计划在未来撰写更多关于这一文件格式的深度文章,期待与您分享更多见解。如果您有任何建议或想法,欢迎通过电子邮件与我联系。
参考文献
- Anastassia Ailamaki, David J. DeWitt, Mark D. Hill, Marios Skounakis, Weaving Relations for Cache Performance.
- Parquet Official Docs.
- Wes McKinney, Extreme IO performance with parallel Apache Parquet in Python (2017).
- Michael Berk, Demystifying the Parquet File Format (2022).
- fastparquet source code GitHub repo.