Apache Parquet 介绍与选型指南
基于官网文档与 Maven Central 梳理 Apache Parquet 列式格式的规范与多语言实现版本基准、文件结构与编码特性、快速上手与 ORC/Avro 量化选型对比,查询日期 2026-10-18
Apache Parquet 介绍与选型指南
一、信息基准
1.1 基本信息
- 查询日期:2026-10-18
- 本文基准对象:Apache Parquet——开源的列式数据文件格式(file format),规范与多语言实现分离发布,故本文不挂单一版本号,以"组件-版本基准表"给出各实现基准
- 维护方:Apache Software Foundation(Apache Parquet 项目)
- 开源许可:Apache License 2.0
- 规范承载:格式规范(parquet.thrift IDL)托管于 parquet-format 仓库,官网文档页明确说明
1.2 组件-版本基准表
| 组件 | 最新稳定版 | 说明与依据 |
|---|---|---|
| parquet-format(格式规范) | 2.14.0 | Maven Central org.apache.parquet:parquet-format 元数据 latest/release 均为 2.14.0,查询日期 2026-10-18 |
| parquet-java(原 parquet-mr,Java 实现) | 1.18.1 | Maven Central org.apache.parquet:parquet-column 元数据 latest/release 均为 1.18.1,工件目录时间 2026-08-31;官方 README 注明该仓库为 Parquet 的 Java 实现 |
| Apache Arrow(C++ parquet 实现) | 随 Apache Arrow 发布 | 官方实现状态页将 arrow(C++,cpp/src/parquet)列为参考实现 |
| arrow-go(Go 实现) | 随 Apache Arrow Go 发布 | 官方实现状态页列出 arrow-go/tree/main/parquet |
| arrow-rs(Rust 实现) | 随 Apache Arrow Rust 发布 | 官方实现状态页列出 arrow-rs 的 parquet 模块 |
| 其他实现 | — | 官方实现状态页另列 ClickHouse、cudf、hyparquet、duckdb、polars、DataHaskell 等,版本随各项目发布 |
1.3 版本依据与官方来源清单
- parquet-java 与 parquet-format 版本均经 Maven Central maven-metadata.xml 于 2026-10-18 交叉核验。
- 实现清单与特性支持矩阵引自官网 Documentation → Implementation status 页(页面最近修改 2025-10-28)。
| 来源 | 地址 | 用途 |
|---|---|---|
| 官网 | https://parquet.apache.org/ | 格式定位与文档入口 |
| 格式文档 | https://parquet.apache.org/docs/ | 规范、概念与实现状态 |
| 实现状态页 | https://parquet.apache.org/docs/file-format/implementationstatus/ | 各语言实现与特性矩阵 |
| parquet-java 仓库 | https://github.com/apache/parquet-java | Java 实现与构建要求 |
| Maven Central | https://repo1.maven.org/maven2/org/apache/parquet/ | 版本交叉核验 |
二、软件概述
2.1 软件定位
Apache Parquet 官网定义:开源的列式数据文件格式(column-oriented data file format),面向高效的数据存储与检索,提供高性能压缩与编码方案以处理海量复杂数据,被众多编程语言与分析工具支持。它不是可执行程序或服务,而是与语言无关的存储格式规范加多语言实现,因此兼容性核心在于"格式规范版本 × 各实现版本"两个口径。
2.2 理论来源
官方 README 指出 Parquet 采用 Dremel 论文描述的 record shredding and assembly 算法表示嵌套结构,因此能在扁平列存之上表达嵌套 schema。
三、核心架构
3.1 分层文件结构
Parquet 文件自上而下为:文件头(magic)、若干行组(row group)、文件尾(footer)。每个行组内按列切分为列块(column chunk),列块再由页(page)组成;footer 以 Thrift 结构记录 schema 与各列块的编解码、统计信息与偏移,是读取端做谓词下推与裁剪的依据。
3.2 数据模型与嵌套表达
schema 由 parquet.thrift 定义,支持必选/可选/重复字段,借助 Dremel 式 repetition/definition levels 实现嵌套数据的无损拆装;官方文档 Concepts 页提供相关术语表。
3.3 编码与压缩
列数据支持 PLAIN、字典、RLE、Delta 系列等编码与 Snappy、GZIP、ZSTD 等压缩(以规范与实现状态页为准);各实现的支持程度不同,官网实现状态页给出逐特性矩阵。
3.4 多实现格局
规范仓库与实现仓库分离:Java 参考实现为 parquet-java(原 parquet-mr),C++/Go/Rust 实现随 Apache Arrow 各语言仓库发布,另有 duckdb、ClickHouse、polars 等引擎内置实现。
四、功能特性
4.1 列式存储与高压缩比
同列数据类型一致,压缩与编码效率高,适合宽表与聚合分析场景的存储成本优化。
4.2 嵌套结构支持
以 repetition/definition levels 表达嵌套与重复字段,兼顾列存与复杂 schema。
4.3 谓词下推与裁剪
footer 统计信息(min/max 等)支持扫描时跳过行组与页,减少 IO。
4.4 生态中立
作为 Hadoop 时代延续至今的事实标准列存格式,被 Spark、Flink、Hive、Trino、duckdb、polars 等引擎原生读写(实现状态页佐证)。
4.5 规范演进
格式规范(parquet-format)独立版本化,当前 2.14.0;实现按自身节奏跟进规范特性。
五、快速上手
5.1 Java 依赖(parquet-java 1.18.1)
Java 实现的常用坐标(Maven Central 实查存在,Group ID org.apache.parquet):
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-hadoop</artifactId>
<version>1.18.1</version>
</dependency>
说明:parquet-java 需要 Java 17 或更高版本构建,并依赖 Thrift 编译器(官方 README"Building"一节,还给出了从归档获取 Thrift 0.25.0 并校验签名的步骤)。
5.2 读写路径
官方 README 明确:parquet-format 仓库承载格式规范,parquet-java 是规范在 JVM 侧的实现;应用通常经由上层引擎(如 Spark、Flink)或 Avro/Protobuf Record 层 API 读写 Parquet 文件,具体 API 以 parquet-java 官方 README 与 javadoc 为准。本文为纯官方资料溯源整理,未做本地安装与运行实测。
来源:https://github.com/apache/parquet-java
六、适用场景与限制
6.1 适用场景
- 数据湖与离线数仓的表存储底座(配合 Iceberg/Delta/Hudi 等表格式);
- OLAP 批扫分析:列裁剪 + 谓词下推 + 高压缩比显著降低扫描与存储成本;
- 跨引擎数据交换格式:一次落盘,Spark/Flink/Trino/duckdb 等多引擎直读。
6.2 限制
- 行级点查与频繁单行更新非其设计目标,更新类负载需上层表格式或 LSM 引擎补位;
- 嵌套 schema 的写路径比扁平结构更重,深度嵌套会带来 shuffle/组装开销;
- 各语言实现对规范特性的支持进度不一,选型时需对照官网实现状态页逐特性确认;
- 格式规范与实现版本双口径演进,升级实现前应确认其支持的规范版本。
七、同类选型对比
7.1 候选说明
同类存储格式候选选取 Apache ORC(列存的另一主流格式)与 Apache Avro(行存的 schema 演进格式),版本数据于 2026-10-18 实查 Maven Central。
7.2 量化对比
| 维度 | Apache Parquet(parquet-java 1.18.1 / 规范 2.14.0) | Apache ORC(orc-core 2.3.1) | Apache Avro(avro 1.12.2) |
|---|---|---|---|
| 开源许可 | Apache-2.0(ASF 项目) | Apache-2.0(ASF 项目) | Apache-2.0(ASF 项目) |
| GitHub stars 与最近发版 | stars 官方未公布;parquet-java 工件 2026-08-31 | stars 官方未公布;Maven Central 元数据更新 2026-07-16 | stars 官方未公布;Maven Central 元数据更新 2026-08-17 |
| 版本节奏 | 规范与实现双线独立演进,1.x 线稳定 | 2.x 线稳定演进 | 1.x 线稳定演进,patch 活跃 |
| 兼容矩阵 | 列存;嵌套表达(Dremel levels);Spark/Flink/Trino/duckdb/polars 等广泛原生支持 | 列存;Hive 生态原生格式,内置轻量索引(stripe 级统计/bloom filter);Hive/Spark 支持成熟 | 行存;schema 演进能力最强,适合消息序列化与流式管道(Kafka 等),分析扫描效率弱于列存 |
数据来源:repo1.maven.org(org.apache.parquet:parquet-column、org.apache.orc:orc-core、org.apache.avro:avro)、parquet.apache.org 实现状态页,查询日期 2026-10-18。
7.3 选型建议
分析型批量扫描与数据湖底座首选 Parquet 或 ORC(深度 Hive 集成与内置索引可倾向 ORC);消息通道与 schema 演进敏感的流式场景选 Avro;Parquet 在跨引擎中立性与生态宽度上占优,是当前湖仓表格式(Iceberg/Delta/Hudi/Paimon)事实上的默认底层文件格式。
八、参考链接
- 官网:https://parquet.apache.org/
- 格式文档:https://parquet.apache.org/docs/
- 实现状态页:https://parquet.apache.org/docs/file-format/implementationstatus/
- 格式规范仓库:https://github.com/apache/parquet-format
- Java 实现仓库:https://github.com/apache/parquet-java
- Maven Central:https://repo1.maven.org/maven2/org/apache/parquet/