原力注入

大数据中的「文件格式」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)。

对比

类别代表格式核心目标典型场景
文件(存储)格式Parquet
、ORC、Avro
优化单文件存储效率
数据分析、序列化传输、流式传输(如 Kafka)
表格格式Iceberg
、Delta、Hudi
管理多文件逻辑与元数据
数据湖、ACID 事务、多引擎协作(如 Flink/Spark/Trino)、数据版本控制

应用场景示例

  • • 实时数仓:文件格式为 Parquet,表格格式为 Iceberg,流程为 Kafka → Flink 实时处理 → 写入 Iceberg(Parquet 文件)→ Trino 查询。
    Iceberg vs. Parquet
    Iceberg vs. Parquet
  • • 频繁更新的用户数据:文件格式为 Parquet,表格格式为 Delta Lake,流程为 Spark 读取用户表 → Merge 操作更新 → 写入 Delta Lake。
  • • 日志分析:文件格式为 JSON(初始导入)→ 转换为 ORC/Parquet,表格格式为 Hive 表,流程为日志文件(JSON)→ Hive 表分区存储(列式格式)→ Hive SQL 分析。

通常组合使用两者,例如数据以 Parquet 格式存储,通过 Iceberg 表格式管理,实现高效存储与逻辑管理的双重优化。