数据序列化格式指南:Parquet, Avro, Proto 及更多
在数据工程和软件开发的世界中,我们如何存储和传输数据至关重要。虽然 JSON 因其易读性而成为 Web API 的主流,但对于大数据处理、高频消息传递或专门的调试来说,它通常过于庞大或缓慢。
本指南探讨了除基础 JSON 和 CSV 之外用于数据序列化的专门文件扩展名。
快速参考表:数据序列化格式
| 扩展名 | 全称 | 格式 | 主要用例 |
|---|---|---|---|
.ndjson, .jsonl |
换行分隔的 JSON | 文本 (ASCII) | 日志文件、数据流、大数据导入 |
.parquet |
Apache Parquet | 二进制 (列式) | 大数据分析 (Hadoop, Spark, AWS S3) |
.avro |
Apache Avro | 二进制 (行式) | 带有模式的数据序列化 (Kafka) |
.proto |
Protocol Buffers | 文本 (DSL) | 定义 gRPC 接口和数据结构 |
.bson |
Binary JSON | 二进制 | MongoDB 存储和数据交换 |
.cbor |
Concise Binary Object Representation | 二进制 | 物联网 (IoT)、低带宽环境 |
.har |
HTTP Archive | 文本 (JSON) | 在浏览器中调试网络请求 |
.edn |
Extensible Data Notation | 文本 (类似 Lisp) | Clojure 生态系统、元数据配置 |
1. 流友好型 JSON (.ndjson, .jsonl)
标准 JSON 需要将整个文件读取到内存中才能解析(它以 [ 开始,以 ] 结束)。对于 100GB 的日志文件来说,这是不可能的。
- NDJSON / JSONL:每一行都是一个有效、独立的 JSON 对象。
- 为什么要使用它? 您可以逐行读取文件,而无需加载整个文件。如果文件被截断或损坏,您只会丢失最后一行,而不是整个数据集。
2. 大数据列式存储 (.parquet, .orc)
传统数据库按行存储数据。分析型数据库通常更喜欢列式存储。
- Parquet:大数据的行业标准。由于它按列存储数据,因此可以更有效地压缩数据,并允许您“跳过”特定查询不需要的列。
- ORC:优化的行列式 (Optimized Row Columnar)。与 Parquet 类似,但主要用于 Apache Hive 生态系统。
3. 模式优先的序列化 (.avro, .proto)
与 JSON 中键名("first_name")在每条记录中都重复不同,模式优先的格式将“规则”与“数据”分离。
- Avro:模式以 JSON 形式存储,但数据是二进制的。它是 Apache Kafka 的标准,因为它速度快并支持模式演变。
- Protobuf (.proto):由 Google 开发。您在
.proto文件中定义数据结构,然后编译器为您喜欢的语言生成代码。它是 gRPC 的核心。
4. 二进制 JSON 替代方案 (.bson, .cbor, .msgpack)
如果您喜欢 JSON 的灵活性但需要更快的速度或更小的文件大小,二进制格式就是答案。
- BSON:MongoDB 内部使用。它比 JSON 支持更多的数据类型(如日期和二进制数据)。
- CBOR:旨在做到极其小巧且高效。它广泛用于物联网 (IoT) 设备,因为在这些设备中,带宽的每一字节都很宝贵。
- MessagePack:与 CBOR 类似,它“像 JSON 但更快更小”。
5. 专门格式 (.har, .edn)
- HAR (HTTP Archive):如果您曾经从 Chrome 或 Firefox 开发人员工具中“导出”过网络追踪,那么它就是一个
.har文件。它实际上只是一个巨大的 JSON 文件,包含您浏览会话中的每个标头、Cookie 和响应正文。 - EDN:主要用于 Clojure 世界。它比 JSON 更强大,因为它原生支持自定义类型(标签)和更复杂的数据结构。
如何查看这些文件
- NDJSON/JSONL:使用任何文本编辑器或
jq命令行工具。 - Parquet:需要专门的查看器或 Python 库(如
pandas或fastparquet)。 - Protobuf:您通常需要
.proto定义文件来解码二进制数据。 - HAR:您可以将其拖回 Chrome/Firefox 开发人员工具或使用 在线 HAR 查看器。
常见问题 (FAQ)
问:为什么我的 Parquet 文件比 CSV 小?
答: Parquet 使用先进的压缩技术,如“字典编码”和“行程编码”。由于它按列存储数据,一列中的值(如“国家/地区”)通常是相同的,因此与文本文件相比,可以实现极大的压缩率。
问:我可以编辑 .proto 文件吗?
答: 可以,.proto 文件是人类可读的文本文件,您可以在其中定义数据结构。但是,您不能直接“编辑”由此生成的二进制数据——您必须使用编译后的代码。
问:.bson 与 JSON 相同吗?
答: 不完全相同。BSON 是一种二进制表示形式,包含类似 JSON 的数据,但也添加了标准 JSON 不支持的类型,如 Buffer、Long 和 Decimal128。
Tool3M 上的相关工具
- JSON 转 CSV 转换器:将您的结构化数据转换为扁平表格。
- 二进制序列化指南:了解有关 Protobuf 和 MessagePack 的更多信息。