他のフォーマットの処理
以前のJSONデータのロードの例では、JSONEachRow
(ndjson)の使用を前提としています。以下に、他の一般的なフォーマットのJSONをロードする例を示します。
JSONオブジェクトの配列
JSONデータの最も一般的な形式の1つは、JSON配列の中にJSONオブジェクトのリストがあることです。次の例をご覧ください:
この種のデータのためのテーブルを作成しましょう:
JSONオブジェクトのリストをインポートするには、JSONEachRow
フォーマット(list.jsonファイルからデータを挿入)を使用します:
ローカルファイルからデータをロードするためにFROM INFILE句を使用しました。インポートが成功したことが確認できます:
NDJSON(行区切りJSON)の処理
多くのアプリは、ログデータをJSON形式で記録し、各ログ行が個別のJSONオブジェクトであるようにします。次のファイルのように:
同じJSONEachRow
フォーマットは、これらのファイルで機能することができます:
JSONオブジェクトのキー
場合によっては、JSONオブジェクトのリストが配列要素の代わりにオブジェクトのプロパティとしてエンコードされていることがあります(例としてobjects.jsonを参照):
ClickHouseは、この種のデータからデータをロードするためにJSONObjectEachRow
フォーマットを使用できます:
親オブジェクトキーの値を指定する
親オブジェクトキーの値もテーブルに保存したいとしましょう。この場合、次のオプションを使用して、キーの値を保存するためのカラム名を定義できます:
これで、file()
関数を使用して、元のJSONファイルからどのデータがロードされるかを確認できます:
id
カラムは正しくキーの値で埋められていることに注意してください。
JSON配列
時には、スペース節約のためにJSONファイルがオブジェクトの代わりに配列としてエンコードされます。この場合、JSON配列のリストに対処します:
この場合、ClickHouseはこのデータをロードし、各値を配列内の順序に基づいて対応するカラムに割り当てます。このためにJSONCompactEachRow
フォーマットを使用します:
JSON配列から個々のカラムをインポートする
場合によっては、データが行単位ではなくカラム単位でエンコードされることがあります。この場合、親JSONオブジェクトには値を持つカラムが含まれます。次のファイルを見てみましょう:
ClickHouseは、このようにフォーマットされたデータを解析するためにJSONColumns
フォーマットを使用します:
オブジェクトの代わりにカラムの配列を処理する際には、よりコンパクトな形式もJSONCompactColumns
フォーマットを使用してサポートされています:
JSONオブジェクトを解析するのではなく保存する
場合によっては、解析するのではなく単一のString
(またはJSON)カラムにJSONオブジェクトを保存したいことがあります。これは、異なる構造のJSONオブジェクトのリストを扱う場合に便利です。このファイルを見てみましょう。親リスト内に複数の異なるJSONオブジェクトがあります:
元のJSONオブジェクトを次のテーブルに保存したいと考えています:
次に、JSONオブジェクトを解析するのではなく保存するためにJSONAsString
フォーマットを使用して、このテーブルにファイルからデータをロードできます:
保存したオブジェクトにクエリを実行するためにJSON関数を使用できます:
JSONAsString
は、通常はJSONEachRow
フォーマットと共に使用されるJSONオブジェクト毎行の形式のファイルでも問題なく機能します。
ネストされたオブジェクトのスキーマ
ネストされたJSONオブジェクトを扱う場合、スキーマを追加で定義し、複雑な型(Array
、Object Data Type
またはTuple
)を使用してデータをロードできます:
ネストされた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
ファイルにエクスポートされます。