data serialization parquet protobuf big-data json binary file-extensions

数据序列化格式指南:Parquet, Avro, Proto 等详解

从可读的 JSON 到高性能二进制格式。了解 .parquet, .avro, .proto, .ndjson, .cbor, .bson 和 .har 文件后缀的区别。

2026-04-11

数据序列化格式指南: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 库(如 pandasfastparquet)。
  • Protobuf:您通常需要 .proto 定义文件来解码二进制数据。
  • HAR:您可以将其拖回 Chrome/Firefox 开发人员工具或使用 在线 HAR 查看器

常见问题 (FAQ)

问:为什么我的 Parquet 文件比 CSV 小?

答: Parquet 使用先进的压缩技术,如“字典编码”和“行程编码”。由于它按列存储数据,一列中的值(如“国家/地区”)通常是相同的,因此与文本文件相比,可以实现极大的压缩率。

问:我可以编辑 .proto 文件吗?

答: 可以,.proto 文件是人类可读的文本文件,您可以在其中定义数据结构。但是,您不能直接“编辑”由此生成的二进制数据——您必须使用编译后的代码。

问:.bson 与 JSON 相同吗?

答: 不完全相同。BSON 是一种二进制表示形式,包含类似 JSON 的数据,但也添加了标准 JSON 不支持的类型,如 BufferLongDecimal128


Tool3M 上的相关工具

  • JSON 转 CSV 转换器:将您的结构化数据转换为扁平表格。
  • 二进制序列化指南:了解有关 Protobuf 和 MessagePack 的更多信息。