メインコンテンツまでスキップ
メインコンテンツまでスキップ

JSONObjectEachRow

InputOutputAlias

説明

このフォーマットでは、すべてのデータが単一の JSON オブジェクトとして表現され、各行はこのオブジェクトの別々のフィールドとして表されます。これは、JSONEachRow フォーマットに似ています。

使用例

基本例

以下の JSON があるとします:

オブジェクト名をカラム値として使用するには、特別な設定である format_json_object_each_row_column_for_object_name を使用できます。 この設定の値は、結果のオブジェクト内の行に対して JSON キーとして使用されるカラムの名前に設定されます。

出力

テーブル test が次の二つのカラムを持っているとしましょう:

これを JSONObjectEachRow フォーマットで出力し、format_json_object_each_row_column_for_object_name 設定を使用しましょう:

入力

前の例からの出力を data.json という名前のファイルに保存したとしましょう:

スキーマ推論にも対応しています:

データの挿入

ClickHouse では以下が可能です:

  • オブジェクト内のキーと値のペアの順序に制限がない。
  • 一部の値を省略すること。

ClickHouse は、要素間の空白やオブジェクト後のカンマを無視します。すべてのオブジェクトを1行で渡すことができます。行の改行で区切る必要はありません。

省略値の処理

ClickHouse は省略された値を対応する データ型 のデフォルト値で置き換えます。

もし DEFAULT expr が指定されている場合、ClickHouse は input_format_defaults_for_omitted_fields 設定に応じて異なる置き換えルールを使用します。

以下のテーブルを考えましょう:

  • input_format_defaults_for_omitted_fields = 0 の場合、xa のデフォルト値は 0 です(UInt32 データ型のデフォルト値として)。
  • input_format_defaults_for_omitted_fields = 1 の場合、x のデフォルト値は 0 ですが、a のデフォルト値は x * 2 になります。
注記

input_format_defaults_for_omitted_fields = 1 の設定でデータを挿入する場合、ClickHouse は input_format_defaults_for_omitted_fields = 0 の設定での挿入と比べて、より多くの計算リソースを消費します。

データの選択

UserActivity テーブルを例にとりましょう:

クエリ SELECT * FROM UserActivity FORMAT JSONEachRow は以下を返します:

JSON フォーマットとは異なり、無効な UTF-8 シーケンスの置き換えは行われません。値は JSON と同様にエスケープされます。

参考

任意のバイトセットを文字列として出力できます。テーブル内のデータが情報を失うことなく JSON 形式でフォーマットできると確信している場合は、JSONEachRow フォーマットを使用してください。

入れ子構造の使用

Nested データ型のカラムを持つテーブルがある場合、同じ構造の JSON データを挿入することができます。この機能は、input_format_import_nested_json 設定を有効にして使用します。

例えば、以下のテーブルを考えましょう:

Nested データ型の説明で示されているように、ClickHouse は入れ子構造の各コンポーネントを別々のカラム(私たちのテーブルに対しては n.sn.i)として扱います。以下の方法でデータを挿入できます:

階層的な JSON オブジェクトとしてデータを挿入するには、input_format_import_nested_json=1 を設定します。

この設定がない場合、ClickHouse は例外をスローします。

フォーマット設定

設定説明デフォルトメモ
input_format_import_nested_json入れ子の JSON データを入れ子のテーブルにマッピングします(JSONEachRow フォーマットで機能します)。false
input_format_json_read_bools_as_numbersJSON 入力フォーマットでブール値を数値として解析できるようにします。true
input_format_json_read_bools_as_stringsJSON 入力フォーマットでブール値を文字列として解析できるようにします。true
input_format_json_read_numbers_as_stringsJSON 入力フォーマットで数値を文字列として解析できるようにします。true
input_format_json_read_arrays_as_stringsJSON 入力フォーマットで JSON 配列を文字列として解析できるようにします。true
input_format_json_read_objects_as_stringsJSON 入力フォーマットで JSON オブジェクトを文字列として解析できるようにします。true
input_format_json_named_tuples_as_objects名前付きタプルカラムを JSON オブジェクトとして解析します。true
input_format_json_try_infer_numbers_from_stringsスキーマ推論中に文字列フィールドから数値を推測しようとします。false
input_format_json_try_infer_named_tuples_from_objectsスキーマ推論中に JSON オブジェクトから名前付きタプルを推測しようとします。true
input_format_json_infer_incomplete_types_as_stringsJSON 入力フォーマットでスキーマ推論中に Nill または空のオブジェクト/配列のみを含むキーに対して型 String を使用します。true
input_format_json_defaults_for_missing_elements_in_named_tuple名前付きタプルを解析中に JSON オブジェクトの欠落している要素にデフォルト値を挿入します。true
input_format_json_ignore_unknown_keys_in_named_tuple名前付きタプルの JSON オブジェクト内の未知のキーを無視します。false
input_format_json_compact_allow_variable_number_of_columnsJSONCompact/JSONCompactEachRow フォーマットで変数数のカラムを許可し、追加のカラムを無視し欠落したカラムにデフォルト値を使用します。false
input_format_json_throw_on_bad_escape_sequenceJSON 文字列に不正なエスケープシーケンスが含まれている場合、例外をスローします。無効にした場合、不正なエスケープシーケンスはデータ内でそのまま残ります。true
input_format_json_empty_as_defaultJSON 入力の空のフィールドをデフォルト値として扱います。false複雑なデフォルト式の場合、input_format_defaults_for_omitted_fields も有効にする必要があります。
output_format_json_quote_64bit_integersJSON 出力フォーマットで 64 ビット整数の引用を制御します。true
output_format_json_quote_64bit_floatsJSON 出力フォーマットで 64 ビット浮動小数点数の引用を制御します。false
output_format_json_quote_denormalsJSON 出力フォーマットで '+nan'、'-nan'、'+inf'、'-inf' の出力を有効にします。false
output_format_json_quote_decimalsJSON 出力フォーマットで小数の引用を制御します。false
output_format_json_escape_forward_slashesJSON 出力フォーマットで文字列出力のスラッシュをエスケープするかどうかを制御します。true
output_format_json_named_tuples_as_objects名前付きタプルカラムを JSON オブジェクトとしてシリアライズします。true
output_format_json_array_of_rowsJSONEachRow(Compact) フォーマットで全行の JSON 配列を出力します。false
output_format_json_validate_utf8JSON 出力フォーマットで UTF-8 シーケンスの検証を有効にします(JSON/JSONCompact/JSONColumnsWithMetadata フォーマットには影響しないため、常に utf8 の検証が行われます)。false