データシリアライゼーション形式ガイド:Parquet、Avro、Protoなど
データエンジニアリングやソフトウェア開発の世界において、データの保存および送信方法は極めて重要です。JSONはその読みやすさからWeb APIの主流ですが、ビッグデータ処理、高頻度のメッセージング、または特殊なデバッグには、肥大化しすぎたり遅すぎたりすることがよくあります。
このガイドでは、基本的なJSONやCSV以外の、データシリアライゼーションに使用される特殊なファイル拡張子について説明します。
クイックリファレンス表:データシリアライゼーション形式
| 拡張子 | 正式名称 | 形式 | 主なユースケース |
|---|---|---|---|
.ndjson, .jsonl |
改行区切りJSON (Newline Delimited 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オブジェクトです。
- なぜ使うのか? ファイル全体をロードせずに、ファイルを1行ずつ読み取ることができます。ファイルが途切れたり破損したりしても、データセット全体ではなく最後の1行だけが失われます。
2. ビッグデータ列指向ストレージ (.parquet, .orc)
従来のデータベースはデータを行ごとに保存します。分析用データベースは多くの場合、列指向 (Columnar) ストレージを好みます。
- 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よりも多くのデータ型(DateやBinaryデータなど)をサポートしています。
- CBOR: 非常に小さく効率的になるように設計されています。帯域幅の1バイトが重要なIoT(モノのインターネット)デバイスで広く使用されています。
- MessagePack: CBORに似ており、「JSONのようだが高速で小さい」形式です。
5. 特殊な形式 (.har, .edn)
- HAR (HTTP Archive): ChromeやFirefoxのデベロッパーツールからネットワークトレースを「エクスポート」したことがあるなら、それは
.harファイルです。実際には、ブラウジングセッションのすべてのヘッダー、クッキー、レスポンスボディを含む巨大なJSONファイルにすぎません。 - EDN: 主にClojureの世界で使用されています。カスタムタイプ(タグ)やより複雑なデータ構造をネイティブでサポートしているため、JSONよりも強力です。
これらのファイルの表示方法
- NDJSON/JSONL: 任意のテキストエディタまたは
jqコマンドラインツールを使用します。 - Parquet: 専用のビューアまたはPythonライブラリ(
pandasやfastparquetなど)が必要です。 - Protobuf: 通常、バイナリデータをデコードするには
.proto定義ファイルが必要です。 - HAR: Chrome/Firefoxのデベロッパーツールにドラッグ&ドロップするか、オンラインHARビューアを使用できます。
よくある質問 (FAQ)
Q: なぜParquetファイルはCSVよりも小さいのですか?
A: Parquetは「辞書符号化」や「ランレングス符号化」などの高度な圧縮技術を使用しています。データを列ごとに保存するため、列内の値(「国」など)が同一であることが多く、テキストファイルと比較して大幅な圧縮率を実現できます。
Q: .protoファイルを編集できますか?
A: はい、.protoファイルはデータ構造を定義する人間が読めるテキストファイルです。ただし、そこから生成されたバイナリデータを直接「編集」することはできません。コンパイルされたコードを使用する必要があります。
Q: .bsonはJSONと同じですか?
A: 厳密には違います。BSONはJSON風のデータを含むバイナリ表現ですが、標準のJSONがサポートしていないBuffer、Long、Decimal128などの型も追加されています。
Tool3Mの関連ツール
- JSON CSV 変換: 構造化データをフラットなテーブルに変換します。
- バイナリシリアライゼーションガイド: ProtobufやMessagePackの詳細はこちら。