構造化JSONの読み込み
NDJSON (改行区切りJSON) フォーマット、すなわちClickHouseでJSONEachRowとして知られるフォーマットであり、カラム名と型が固定された構造化データであることを前提とします。NDJSONは簡潔でスペース効率に優れるため、JSONの読み込みに推奨されるフォーマットですが、入力と出力の両方で他のフォーマットもサポートされています。
次のJSONサンプルは、Python PyPIデータセットの1行を表しています:
可能であれば静的なスキーマを優先してくださいカラム名と型が固定されており、新しいカラムが追加される見込みがない場合は、本番環境では常に静的に定義されたスキーマを優先してください。JSON型は、カラム名や型が変わる可能性のある、非常に動的なデータに適しています。この型は、プロトタイピングやデータ探索にも役立ちます。
ソートキーここでは、
ORDER BY 句でソートキーを指定しています。ソートキーの詳細と選び方については、こちらを参照してください。*.json.gz ファイルを読み込みます。ClickHouse はファイルの拡張子と内容からフォーマットが JSONEachRow (ndjson) であることを自動的に推測します。ClickHouse が検出できない場合は、パラメータ関数を使ってフォーマットを手動で指定できます。
圧縮ファイル上記のファイルは圧縮形式にも対応しており、ClickHouse が自動的に検出して処理します。
INSERT INTO SELECT を使用します。
FORMAT 句 を使ってインラインで読み込むこともできます。たとえば、
JSONEachRow フォーマットを使用することを前提としています。その他の一般的な JSON フォーマットにも対応しており、それらの読み込み例はこちらで確認できます。
半構造化 JSON の読み込み
JSON 型でこれに対応しています。
次に、上記の Python PyPI dataset を拡張したバージョンの例を見てみましょう。ここでは、任意のキーと値のペアを含む tags カラムを追加しています。
tagsカラムは内容が一定ではないため、スキーマとして定義できません。このデータを読み込むには、先ほどのスキーマを使いつつ、型をJSONとする追加のtagsカラムを指定できます。
JSON 型を使用するケース
- キーが固定されておらず、時間の経過とともに変化する。
- 値の型が一定ではない (例: path には文字列が入ることもあれば、数値が入ることもある) 。
- 厳密な型付けが現実的でなく、スキーマに柔軟性が求められる。
- 既知のキーを持つフラットな構造: 標準的なカラム型 (例: String) を使用します。
- 予測可能なネスト構造: このような構造には Tuple、Array、または Nested 型を使用します。
- 構造は予測可能だが型が変わる: 代わりに Dynamic 型または Variant 型を検討してください。