Super Sale WeekClaude Skills — 20% OFF
Glossary

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

Powerdrill Bloom·
精通 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 个行组”,每列作为独立的块存储在每个组内。这种布局允许读取器跳过他们不需要的组和列。