FORMAT COMPARISON
JSON Lines vs Avro
JSON LinesはUTF-8の各行に独立したJSON値を記録し、1件ずつ処理や追記ができます。Avroはスキーマに基づいて型付きレコードを直列化し、Object Container Fileには書き手のスキーマとデータブロックを格納できます。
JSON LinesとAvro、どちらを選ぶ?
人が読めるイベント記録、行単位のツール処理、簡単なストリーミングや追記にはJSON Linesを検討します。型付きレコード、スキーマ解決、ブロック単位の保存を管理するデータ基盤ではAvroが候補です。スキーマの配布先、読み手、型変換を確認し、どちらかが常に高速・小容量とは決めつけないでください。
JSON Lines向き
行単位で処理するログや記録・JSONレコードのストリーミング交換
- データを1行ずつ読み書きする
- テキスト処理ツールで追記・連結する
Avro向き
スキーマ付きレコードデータのシリアライズと交換
- イベントやレコードをスキーマとともに扱うデータ連携
基本情報を比較
JSON LinesとAvroの主な違いを確認できます。
| 項目 | JSON Lines | Avro |
|---|---|---|
| 拡張子 | .jsonl、.ndjson | .avro |
| MIME Type | application/jsonl | application/avro |
| 主な用途 | 行単位で処理するログや記録・JSONレコードのストリーミング交換 | スキーマ付きレコードデータのシリアライズと交換 |
| 圧縮 | none | schema_serialization |
| 開く方法 | テキストエディタやJSON Lines対応ツールで開きます。1行ずつJSONとして検証すると、どのレコードに構文エラーがあるか確認しやすくなります。 | Avro対応ツールでスキーマ、フィールド、型、レコード内容を確認します。 |
| 書き出し・変換 | JSON配列へ変換するときは全行を配列要素にまとめ、JSON Linesへ戻すときは各要素を1行ずつ書き出します。大量データではメモリ使用量に注意します。 | JSONやParquetへ変換する場合は、フィールド名、型、null、論理型、スキーマ互換性を確認します。 |
用途別の選び方
作りたいものや使う場面から選べます。
データを1行ずつ読み書きする
行単位で処理するログや記録・JSONレコードのストリーミング交換
JSON Lines向きテキスト処理ツールで追記・連結する
行単位で処理するログや記録・JSONレコードのストリーミング交換
JSON Lines向きイベントやレコードをスキーマとともに扱うデータ連携
スキーマ付きレコードデータのシリアライズと交換
Avro向き確認ポイント 1
JSON LinesはUTF-8テキストで、1行にJSON値を1つ記録します。末尾の改行があると完全なレコードを連結しやすくなります。Avroのバイナリデータは書き手のスキーマを使って読み、Object Container Fileではブロックとともにスキーマ情報を保存します。
使い分け確認ポイント 2
JSON Linesは各レコードの項目が同じであることを要求しません。Avroのレコードは宣言済みスキーマに従い、既定値や型昇格など仕様が認める変更を読み手と書き手のスキーマ間で解決できます。
使い分け選ぶ理由を詳しく
- JSON Linesはテキストツールで確認しやすい一方、項目名を繰り返し、型の約束をアプリ側に委ねます。Avroは型付きレコードをコンパクトに符号化できますが、読み手には対応ソフトウェアとスキーマが必要です。
よくある質問
JSON LinesはAvroのJSONエンコーディングと同じですか?
いいえ。JSON Linesは通常のJSON値を行で区切る慣習です。AvroにもJSONエンコーディングがありますが、Avroのスキーマやunionの規則に従います。
AvroファイルをJSON Linesのように追記できますか?
AvroのObject Container Fileを単なるテキストとして扱わないでください。ブロックやメタデータを正しく保てるAvroライブラリで書き込みます。