科普:“表格式 ”与“ 存储格式”
表格式(Table Format)和存储格式(File Format)的总结如下,结合其核心特点和典型应用场景:
一、存储格式(File Format)
存储格式定义数据在文件中的物理存储方式,直接影响读写性能、压缩效率和兼容性。
1. 列式存储
-
Parquet
- 特点:列式存储,高压缩率,支持复杂嵌套结构,适合 OLAP 场景。
- 应用:大数据分析(Spark、Hive)、数据湖存储。
- 示例:
user.parquet
文件按列存储user_id
,name
,age
。
-
ORC (Optimized Row Columnar)
- 特点:优化行列混合存储,支持索引和谓词下推,Hive 生态常用。
- 应用:Hive 数据仓库、批量 ETL 处理。
- 示例:
sales.orc
文件按列存储订单数据,含轻量索引加速查询。
2. 行式存储
-
Avro
- 特点:基于 Schema 的行式存储,支持动态模式演化,适合流式数据传输。
- 应用:Kafka 消息序列化、跨语言数据交换。
- 示例:Kafka 中的用户行为日志以 Avro 格式存储。
-
CSV/TSV
- 特点:纯文本,人类可读,兼容性强,但无压缩和模式信息。
- 应用:数据导入导出、小型数据集交换。
- 示例:
data.csv
文件以逗号分隔存储用户信息。
-
JSON
- 特点:半结构化,支持嵌套数据,但解析效率低。
- 应用:Web API 响应、日志存储。
- 示例:
logs.json
文件记录应用日志,含时间戳和事件详情。
3. 混合存储
- Arrow
- 特点:内存列式格式,零拷贝读取,用于高速内存计算。
- 应用:Pandas、Spark 内存计算,跨系统数据传输。
- 示例:Spark 与 Flink 通过 Arrow 格式共享内存数据。
二、表格式(Table Format)
表格式是逻辑层的元数据规范,管理数据文件的组织、事务、版本等,与存储格式解耦。
1. 数据湖表格式
-
Apache Iceberg
- 特点:支持 ACID 事务、隐藏分区、时间旅行,引擎无关(Flink/Spark/Trino)。
- 应用:实时数据湖、多引擎协作。
- 示例:Flink 实时写入 Iceberg 表,Spark 批处理分析。
-
Delta Lake
- 特点:基于 Spark 生态,提供 ACID 事务和 Upsert 操作,深度集成 Spark。
- 应用:湖仓一体、频繁更新的场景(如用户画像)。
- 示例:Spark Streaming 写入 Delta Lake,支持 Merge 操作更新数据。
-
Apache Hudi
- 特点:专注于增量更新(CDC),支持高效的 Upsert 和增量拉取。
- 应用:实时数据管道、CDC 场景。
- 示例:MySQL Binlog 同步到 Hudi 表,下游消费增量数据。
2. 传统表格式
- Hive 表
- 特点:基于目录分区,元数据存储在 Hive Metastore,功能简单。
- 应用:离线批处理(Hive/Spark SQL)。
- 示例:Hive 表按日期分区存储日志,通过 HQL 查询。
三、核心对比
类别 | 代表格式 | 核心目标 | 典型场景 |
---|---|---|---|
存储格式 | Parquet、ORC、Avro | 优化单文件存储效率 | 数据分析、序列化传输 |
表格式 | Iceberg、Delta、Hudi | 管理多文件逻辑与元数据 | 数据湖、ACID 事务、多引擎协作 |
四、应用场景示例
-
实时数仓
- 存储格式:Parquet(高效列式存储)。
- 表格式:Iceberg(事务支持 + 时间旅行)。
- 流程:Kafka → Flink 实时处理 → 写入 Iceberg(Parquet 文件) → Trino 查询。
-
频繁更新的用户数据
- 存储格式:ORC(压缩率高)。
- 表格式:Delta Lake(Upsert 支持)。
- 流程:Spark 读取用户表 → Merge 操作更新 → 写入 Delta Lake。
-
日志分析
- 存储格式:JSON(原始日志半结构化)。
- 表格式:Hive 表(简单分区管理)。
- 流程:日志文件(JSON) → Hive 表分区存储 → Hive SQL 分析。
五、实际架构设计
- 存储格式:解决单文件如何高效存储数据,关注压缩、编码、读写性能。
- 表格式:解决多文件如何组织与管理,关注事务、版本、跨引擎兼容性。
通常组合使用两者,例如:
- 数据以 Parquet 格式存储,
- 通过 Iceberg 表格式管理,
- 实现高效存储与逻辑管理的双重优化。