大数据中的「文件格式」vs. 「表格格式」
“表格格式” vs. “文件(存储)格式”
Parquet 等文件格式与 Iceberg 等表格格式之间的主要区别在于它们的用途。文件格式专注于高效存储和压缩数据。它们定义了如何在磁盘或分布式文件系统(如 Amazon S3)中组织和编码表示记录和列的原始字节。
相比之下,表格格式在存储的数据之上提供了逻辑抽象,以方便组织、查询和更新。它们使 SQL 引擎能够将文件集合视为具有行和列的表格,可以以事务方式查询和更新这些行和列。例如,Iceberg 跟踪有关数据文件的元数据,使引擎能够理解表的架构、分区、快照等。因此,虽然 Parquet 处理低级表示和存储,但 Iceberg 添加了表语义和功能,例如 ACID 事务、时间旅行和架构演变。
文件(存储)格式(File Format)
存储格式定义了数据在文件中的物理存储方式,直接影响读写性能、压缩效率和兼容性。主要分为以下几类:
• 列式存储 • Parquet:高压缩率,支持复杂嵌套结构,适合 OLAP场景,应用于大数据分析(如Spark、Hive)和数据湖存储。• ORC (Optimized Row Columnar):优化行列混合存储,支持索引和谓词下推,常用于 Hive数据仓库和批量 ETL 处理。• 行式存储 • Avro:基于 Schema的行式存储,支持动态模式演化,适合流式数据传输(如Kafka消息序列化),应用于跨语言数据交换和实时数据管道。• CSV/TSV:纯文本格式,人类可读,兼容性强,但无压缩和模式信息,适用于数据导入导出和小型数据集交换。 • JSON:半结构化,支持嵌套数据,但解析效率低,常用于 Web API响应和日志存储(需后续转换为高效格式如 Parquet)。• 混合存储 • Arrow:内存列式格式,支持零拷贝读取,用于高速内存计算(如 Pandas、Spark内存计算),不用于持久化存储。
表格格式(Table Format)
表格格式是逻辑层的元数据规范,管理数据文件的组织、事务、版本等,与存储格式解耦。主要分为以下几类:
• 数据湖表格格式 • Apache Iceberg:支持 ACID事务、隐藏分区、时间旅行(数据版本控制),引擎无关(如Flink、Spark、Trino),应用于实时数据湖和多引擎协作。• Delta Lake:基于 Spark生态,提供ACID事务和Upsert操作,深度集成Spark,适用于湖仓一体和频繁更新的场景(底层默认使用 Parquet)。• Apache Hudi:专注于增量更新( CDC),支持高效的Upsert和增量拉取,应用于实时数据管道和CDC场景。• 传统表格格式 • Hive 表:基于目录分区,元数据存储在 Hive Metastore,支持分区、分桶等管理,但功能有限(缺乏 ACID 事务),适用于离线批处理(如Hive/Spark SQL)。
对比
| 类别 | 代表格式 | 核心目标 | 典型场景 |
| 文件(存储)格式 | ParquetORC、Avro | ||
| 表格格式 | IcebergDelta、Hudi |
应用场景示例
• 实时数仓:文件格式为 Parquet,表格格式为Iceberg,流程为Kafka→Flink实时处理 → 写入Iceberg(Parquet文件)→Trino查询。Iceberg vs. Parquet • 频繁更新的用户数据:文件格式为 Parquet,表格格式为Delta Lake,流程为Spark读取用户表 →Merge操作更新 → 写入Delta Lake。• 日志分析:文件格式为 JSON(初始导入)→ 转换为ORC/Parquet,表格格式为Hive 表,流程为日志文件(JSON)→Hive表分区存储(列式格式)→Hive SQL分析。
通常组合使用两者,例如数据以 Parquet 格式存储,通过 Iceberg 表格式管理,实现高效存储与逻辑管理的双重优化。