精通 Parquet 文件:结构、应用场景与核心优势

Parquet 文件按列而不是按行存储数据。Apache Parquet 项目将其描述为“一种开源的、面向列的数据文件格式,旨在实现高效的数据存储和检索”。正是这一设计选择,解释了为什么它体积更小、查询更快,但双击却更难打开。
什么是 Parquet 文件?
Parquet 是一种用于表格数据的文件格式,作为一个 Apache 项目进行维护。官方文档指出,它“提供了高性能的压缩和编码方案,以批量处理复杂的数据”。文档还补充道,该格式“得到了许多编程语言和分析工具的支持”。
其决定性特征是排列方向。CSV 一次写入一行:先写入记录一的每个字段,然后是记录二的每个字段。而 Parquet 一次写入一列:先写入第一列的每个值,然后是第二列的每个值。
这听起来像是一个技术细节,但它带来了两个重大影响。单列中的值往往彼此相似,这使得它们的压缩效果远好于混合行。此外,如果一个查询在 90 列中只需要 3 列,它只需读取这 3 列,而无需扫描每一行并丢弃其中的大部分内容。
该格式有正式的规范。Apache 文档指出,“parquet-format 仓库托管了 Parquet 文件格式的官方规范,定义了数据的结构和存储方式”。
Parquet 文件的结构
外壳(Envelope)
每个 Parquet 文件都以相同的 4 个字节开头和结尾。规范显示,开头是一个“4 字节魔数 'PAR1'”,结尾也是相同的魔数。
在它们之间是数据,而在接近尾部的地方是元数据。在结束魔数之前,是一个“4 字节的文件元数据长度(小端序)”。该值告诉读取器需要向后跳转多少字节才能找到元数据块。
行组和列块
在外壳内部,数据被进行了两次划分。规范将文件描述为“该表中有 N 列,被分割为 M 个行组”。
行组是一个水平切片——即一批行。在每个行组内,每一列的值都作为列块存储在一起。因此,一个包含 90 列 and 10 个行组的文件拥有 900 个列块,每个列块都是来自单列的连续值。
这种双重划分使得选择性读取成为可能。查询可以跳过完全不包含匹配行的整个行组,然后仅从剩余的行组中读取所需的列块。
为什么元数据位于末尾
这让那些期望看到文件头的人感到意外。Apache 文档直接解释了原因:“文件元数据是在数据之后写入的,以便进行单次写入(single pass writing)。”
写入器在流式传输大型数据集时,在写入完成之前是无法知道每个块的最终字节位置的。将元数据放在最后意味着它永远不需要回头去修改文件头。
读取模式也由此而来。根据文档,文件元数据“包含所有列块起始位置的定位”。文档还补充道,“读取器应该首先读取文件元数据,以找到它们感兴趣的所有列块”。
Parquet 的用途
您通常会在以下四种情况之一中遇到 .parquet 文件。
数据仓库导出。 当有人从现代数据仓库中导出大表时,这通常是默认格式,因为文件大小依然可控。
数据湖存储。 存放在云对象存储中的文件通常使用它,这正是因为查询引擎可以只读取列的子集,而无需下载所有内容。
团队间的交接。 数据工程师向您发送一年的交易数据时,通常会选择它,而不是体积要大上数倍的 CSV 文件。
分析工具间的数据交换。 由于该格式在许多语言和工具中都得到支持,因此它可以在系统之间传输,而无需中间转换步骤。
它们的共同点在于文件大小。当 CSV 文件大到不便传输时,它就成了显而易见的选择。
Parquet vs CSV
| Parquet | CSV | |
|---|---|---|
| 排列方向 | 面向列 | 面向行 |
| 可在文本编辑器中读取 | 否,它是二进制文件 | 是 |
| 典型文件大小 | 更小,通过列压缩实现 | 相同数据下体积更大 |
| 读取少数几列 | 仅读取这些列块 | 读取整个文件 |
| 数据类型 | 携带在文件元数据中 | 由打开它的程序推断 |
| 双击打开 | 通常不能 | 通常在电子表格中打开 |
| 最擅长 | 大表、重复查询 | 小表、快速查看、通用共享 |
类型行为值得注意。CSV 无法知道 00123 是数字还是字符串,这就是为什么在导入时前导零和日期会变得混乱。Parquet 在其元数据中记录了类型,因此您写入的值就是您读取回来的值。
对于此对比中面向行的一侧,CSV 详解从另一个方向涵盖了相同的内容。TSV 分析则涵盖了制表符分隔的变体。
核心优势
真正具有复合效应的压缩。 将相似的值相邻存储,为编码器提供了更多的发挥空间。Apache 文档将其归功于“高性能的压缩 and 编码方案”。
列裁剪。 在 90 列中读取 3 列,其 I/O 开销大约仅为 3 列,而不是 90 列。
行组跳过。 由于元数据记录了每个行组中的内容,读取器可以在接触它们之前丢弃整个切片。
类型在传输中得以保留。 日期保持为日期,标识符保留其前导零,因为模式(schema)随文件一起传输。
单次写入。 位于末尾的元数据意味着非常大的文件可以作为流进行写入。
广泛的支持。 文档指出它在“许多编程语言 and 分析工具”中都得到支持,因此它很少会遇到兼容性死胡同。
Parquet 的局限性
Parquet 解决了存储 and 检索问题。但它无法解决您对文件实际内容的任何疑问。
它是二进制文件,因此您无法一眼看清。打开 CSV 检查收入列是毛利还是净利只需 5 秒钟。而二进制文件则需要工具才能让您看到任何内容。
它也不适合小数据。对于一个 200 行的查找表,元数据开销 and 工具要求超过了任何压缩带来的好处。在这种情况下,CSV 是更好的格式,坦率面对这一点是善用 Parquet 的一部分。
而且它无法保证数据质量。文件可能会携带类型完美、压缩高效的垃圾数据。重复的记录、混合了两种货币的货币列、在 3 月份更改了模式的客户 ID。该格式保证的是保真度,而不是正确性。
非工程师如何处理 Parquet 文件
这就是实际存在的差距。大多数业务工具都默认使用电子表格,而 .parquet 文件无法像 CSV 那样直接打开。
务实的途径是进行转换。向生成该文件的人索取您实际需要的列的 CSV 或 Excel 提取版本,或者使用任何支持 Parquet 的工具自己进行转换。您会失去压缩优势,但一旦数据下载到您的电脑上并缩小了范围,这就无关紧要了。
从那时起,工作就是普通的分析。Powerdrill Bloom 的定价页面列出了对 Excel、CSV、PDF 和文档的上传支持,因此转换后的提取内容可以直接导入。您可以使用自然语言提问,而不是编写查询语句。CSV AI assistant 涵盖了这一路径,而数据连接器则涵盖了更适合拉取数据而不是导出数据的情况。
值得记住的区别在于,Parquet 是您上游做出的存储决策。它不是一个分析工具,一旦文件到达您的办公桌,将其转换掉是正常操作,而不是一种权宜之计。
结论
Parquet 是一种面向列的存储,其模式和索引位于文件末尾。这种设计带来了压缩、选择性读取 and 可靠的数据类型,这就是为什么它已成为处理任何大型数据的默认选择。
它无法带来的是可见性。一旦文件到达需要答案而不是存储空间的人手中,有用的下一步通常是获取限定范围的提取内容并提出问题。
如果您正处于这一阶段,请使用转换后的文件尝试 Powerdrill Bloom,并从将其转换为图表开始。
常见问题解答
Parquet 文件有什么用途?
Parquet 用于高效存储大型表格数据集。它常用于数据仓库导出、数据湖存储、团队间的交接以及分析工具之间的数据交换。原因在于它压缩效果好,并且支持仅读取选定的列。
Parquet 比 CSV 更好吗?
对于需要重复查询的大表,是的:它体积更小、携带数据类型,并支持列裁剪。对于需要查看或广泛共享的小表,CSV 更容易,因为它是文本格式,可以在任何地方打开。
我可以在 Excel 中打开 Parquet 文件吗?
无法通过双击打开,因为 Parquet 是二进制格式,而不是文本。常见的方法是先将其转换为 CSV 或 Excel,或者使用直接读取 Parquet 的工具。
为什么 Parquet 元数据存储在文件末尾?
Apache 文档解释说,元数据是在数据之后写入的,“以便进行单次写入”。写入器在流式传输大型数据集时,无法提前知道最终的块位置,因此最后写入元数据可以避免重新修改文件头。
Parquet 中的行组是什么?
行组是表的水平切片。规范将文件的列描述为“分割为 M 个行组”,每列作为独立的块存储在每个组内。这种布局允许读取器跳过他们不需要的组和列。