メインコンテンツへスキップ
これまでのJSONデータ読み込みの例では、JSONEachRow (NDJSON) を使用することを前提にしています。このフォーマットでは、各JSON行のキーをカラムとして読み込みます。たとえば、次のとおりです。
これは一般的に JSON で最もよく使われるフォーマットですが、ほかのフォーマットを扱うことや、JSON を単一のオブジェクトとして読み取る必要がある場合もあります。 以下では、JSON をほかの一般的なフォーマットで読み取ったり、読み込んだりする例を示します。

JSON をオブジェクトとして読み込む

これまでの例では、JSONEachRow が改行区切りの JSON をどのように読み込むかを示しました。各行は個別のオブジェクトとして読み込まれ、テーブルの 1 行に対応付けられ、各キーは 1 つのカラムに対応します。これは、各カラムの型が 1 つに定まっていて、JSON の構造が予測しやすい場合に最適です。 一方、JSONAsObject は各行を 1 つの JSON オブジェクトとして扱い、JSON 型の単一カラムに格納します。そのため、ネストされた JSON ペイロードや、キーが動的で複数の型を取りうるケースにより適しています。 行単位で insert する場合は JSONEachRow を使用し、柔軟または動的な JSON データを保存する場合は JSONAsObject を使用してください。 上記の例と対比すると、次のクエリでは同じデータを各行ごとに 1 つの JSON オブジェクトとして読み込みます。
JSONAsObject は、たとえば単一の JSONオブジェクト・カラムを使ってテーブルに行を挿入する場合に便利です。
JSONAsObject フォーマットは、オブジェクトの構造が一貫していない場合に、改行区切りの JSON を読み込む際にも役立ちます。たとえば、あるキーの型が行によって異なる場合です (文字列のこともあれば、オブジェクトのこともあります) 。このような場合、ClickHouse は JSONEachRow では安定したスキーマを推論できず、JSONAsObject を使うと、厳密な型チェックを行わずにデータを取り込み、各 JSON 行全体を 1 つのカラムに格納できます。たとえば、次の例では JSONEachRow が失敗することがわかります。
一方、このケースでは、JSON 型が同じサブカラムに複数の型を許容するため、JSONAsObject を使用できます。

JSONオブジェクトの配列

JSONデータで最も一般的な形式の1つは、この例のように、JSON 配列の中にJSON オブジェクトのリストを含むものです:
この種のデータ用にテーブルを作成しましょう:
JSONオブジェクトのリストをインポートするには、JSONEachRow フォーマットを使用できます (list.json ファイルからデータを挿入します) :
ローカルファイルからデータを読み込むために FROM INFILE 句を使用しました。インポートが成功していることが確認できます。

JSON オブジェクトのキー

場合によっては、JSON オブジェクト のリストは、配列の要素ではなくオブジェクトのプロパティとしてエンコードされることがあります (例については objects.json を参照してください) :
ClickHouseでは、JSONObjectEachRowフォーマットを使用して、この種のデータを読み込めます:

親オブジェクトのキー値を指定する

親オブジェクトのキーの値もテーブルに保存したいとします。この場合、キー値の保存先となるカラム名を指定するには、次のオプションを使用できます。
ここで、file()関数を使って、元のJSONファイルからどのデータが読み込まれるのかを確認できます。
id カラムにキーの値が正しく格納されていることに注目してください。

JSON配列

容量を節約するために、JSONファイルがオブジェクトではなく配列としてエンコードされている場合があります。この場合は、JSON配列のリストを扱います。
この場合、ClickHouse はこのデータを読み込み、配列内の順序に基づいて各値を対応するカラムに対応付けます。これには、JSONCompactEachRow フォーマットを使用します。

JSON配列から個々のカラムをインポートする

場合によっては、データが行単位ではなくカラム単位でエンコードされることがあります。この場合、親のJSONオブジェクトには値を格納したカラムが含まれます。次のファイルを見てみましょう。
ClickHouse は、そのようにフォーマットされたデータを解析するために JSONColumns フォーマットを使用します。
オブジェクトではなくカラムの配列を扱う場合は、JSONCompactColumnsフォーマットによる、よりコンパクトな形式もサポートされています。

JSON オブジェクトをパースせずに保存する

JSON オブジェクトをパースせず、単一の String (または JSON) カラムに保存したいケースもあります。これは、構造が異なる JSON オブジェクトのリストを扱う場合に便利です。たとえば、このファイル には、1 つの親配列の中に複数の異なる JSON オブジェクトが含まれています。
元のJSONオブジェクトは次のテーブルに保存します。
これで、JSONオブジェクトをパースせずそのまま保持するために、JSONAsString フォーマットを使って、ファイルからこのテーブルにデータを読み込めます。
そして、保存されたオブジェクトをクエリするには、JSON 関数 を使用できます。
JSONAsString は、1行ごとに1つのJSONオブジェクトを含む形式のファイル (通常は JSONEachRow フォーマットで使用) であれば、問題なく動作します。

ネストされたオブジェクトのスキーマ

ネストされた JSON オブジェクト を扱う場合は、明示的にスキーマを定義し、複合型 (ArrayJSONTuple) を使用してデータを読み込むことができます。

ネストされたJSONオブジェクトへのアクセス

以下の設定オプションを有効にすると、ネストされたJSONキーを参照できます。
これにより、ネストされたJSONオブジェクトのキーをドット記法で参照できます (使用するにはバッククォートで囲む必要がある点に注意してください) :
この方法なら、ネストされたJSONオブジェクトをフラット化したり、その中の一部の値を個別のカラムとして保存したりできます。

不明なカラムをスキップする

デフォルトでは、ClickHouse は JSON データのインポート時に不明なカラムを無視します。では、month カラムのないテーブルに元のファイルをインポートしてみましょう。
3 つのカラムを持つ 元の JSON データ は、このテーブルにそのまま挿入できます:
ClickHouse はインポート時に不明なカラムを無視します。この動作は、設定オプション input_format_skip_unknown_fields で無効にできます。
ClickHouse は、JSON とテーブルのカラム構造が一致しない場合に例外を発生させます。

BSON

ClickHouse では、BSON でエンコードされたファイルへのデータのエクスポートと、そこからのデータのインポートが可能です。このフォーマットは、一部の DBMS、たとえば MongoDB データベースで使用されています。 BSON データをインポートするには、BSONEachRow フォーマットを使用します。この BSON ファイル からデータをインポートしてみましょう。
同じフォーマットを使って、BSONファイルにエクスポートすることもできます。
その後、データが out.bson ファイルに書き出されます。
最終更新日 2026年7月2日