| 入力 | 出力 | エイリアス |
|---|---|---|
| ✔ | ✔ |
説明
このフォーマットでは、すべてのデータが1つのJSONオブジェクトとして表現され、各行は JSONEachRow フォーマットと同様に、そのオブジェクト内の個別のフィールドとして表されます。
使用例
基本例
次の JSON があるとします。
{
"row_1": {"num": 42, "str": "hello", "arr": [0,1]},
"row_2": {"num": 43, "str": "hello", "arr": [0,1,2]},
"row_3": {"num": 44, "str": "hello", "arr": [0,1,2,3]}
}オブジェクト名をカラムの値として使用するには、特別な設定 format_json_object_each_row_column_for_object_name を使用できます。
この設定の値にはカラム名を指定します。指定したカラム名は、生成されるオブジェクト内で各行の JSON キーとして使用されます。
出力
test というテーブルに 2 つのカラムがあるとしましょう。
┌─object_name─┬─number─┐
│ first_obj │ 1 │
│ second_obj │ 2 │
│ third_obj │ 3 │
└─────────────┴────────┘JSONObjectEachRow フォーマットで出力し、format_json_object_each_row_column_for_object_name 設定を使用します。
SELECT * FROM test SETTINGS format_json_object_each_row_column_for_object_name='object_name'{
"first_obj": {"number": 1},
"second_obj": {"number": 2},
"third_obj": {"number": 3}
}入力
前の例の出力を data.json という名前のファイルに保存したとします:
SELECT * FROM file('data.json', JSONObjectEachRow, 'object_name String, number UInt64') SETTINGS format_json_object_each_row_column_for_object_name='object_name'┌─object_name─┬─number─┐
│ first_obj │ 1 │
│ second_obj │ 2 │
│ third_obj │ 3 │
└─────────────┴────────┘スキーマ推論にも利用できます:
DESCRIBE file('data.json', JSONObjectEachRow) SETTING format_json_object_each_row_column_for_object_name='object_name'┌─name────────┬─type────────────┐
│ object_name │ String │
│ number │ Nullable(Int64) │
└─────────────┴─────────────────┘データの挿入
INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}ClickHouse では次のことが可能です。
- オブジェクト内のキー・バリューのペアは、どのような順序でも指定できます。
- 一部の値は省略できます。
ClickHouse は、要素間の空白やオブジェクトの後のカンマを無視します。すべてのオブジェクトを1行で渡すこともできます。改行で区切る必要はありません。
省略された値の処理
ClickHouse は、省略された値を対応するデータ型のデフォルト値に置き換えます。
DEFAULT expr が指定されている場合、ClickHouse は input_format_defaults_for_omitted_fields 設定に応じて、異なる置き換えルールを使用します。
次のテーブルを考えます。
CREATE TABLE IF NOT EXISTS example_table
(
x UInt32,
a DEFAULT x * 2
) ENGINE = Memory;input_format_defaults_for_omitted_fields = 0の場合、xとaのデフォルト値はいずれも0です (UInt32データ型のデフォルト値) 。input_format_defaults_for_omitted_fields = 1の場合、xのデフォルト値は0ですが、aのデフォルト値はx * 2になります。
データの取得
例として、UserActivityテーブルを見てみましょう。
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
│ 4324182021466249494 │ 5 │ 146 │ -1 │
│ 4324182021466249494 │ 6 │ 185 │ 1 │
└─────────────────────┴───────────┴──────────┴──────┘クエリ SELECT * FROM UserActivity FORMAT JSONEachRow は次の結果を返します。
{"UserID":"4324182021466249494","PageViews":5,"Duration":146,"Sign":-1}
{"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}JSON フォーマットとは異なり、無効な UTF-8 シーケンスは置換されません。値は JSON と同じ方法でエスケープされます。
Nested 構造の使用
Nested データ型のカラムを持つテーブルがある場合、同じ構造の JSON データを挿入できます。この機能は、input_format_import_nested_json 設定を有効にすることで使用できます。
たとえば、次のテーブルを考えてみましょう。
CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = MemoryNested データ型の説明にあるとおり、ClickHouse ではネスト構造の各要素を個別のカラム (このテーブルでは n.s と n.i) として扱います。データは次のように挿入できます。
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n.s": ["abc", "def"], "n.i": [1, 23]}階層的なJSONオブジェクトとしてデータを挿入するには、input_format_import_nested_json=1を設定します。
{
"n": {
"s": ["abc", "def"],
"i": [1, 23]
}
}この設定がない場合、ClickHouse は例外をスローします。
SELECT name, value FROM system.settings WHERE name = 'input_format_import_nested_json'┌─name────────────────────────────┬─value─┐
│ input_format_import_nested_json │ 0 │
└─────────────────────────────────┴───────┘INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: n: (at row 1)SET input_format_import_nested_json=1
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}
SELECT * FROM json_each_row_nested┌─n.s───────────┬─n.i────┐
│ ['abc','def'] │ [1,23] │
└───────────────┴────────┘フォーマット設定
| 設定 | 説明 | デフォルト | 注記 |
|---|---|---|---|
input_format_import_nested_json |
入れ子の JSON データを入れ子テーブルにマッピングします (JSONEachRow フォーマットで機能します) 。 | false |
|
input_format_json_read_bools_as_numbers |
JSON input formats で、Bools を数値として解析することを許可します。 | true |
|
input_format_json_read_bools_as_strings |
JSON input formatsで、BoolをStringとして解析できるようにします。 | true |
|
input_format_json_read_numbers_as_strings |
JSON input formatsで、数値をStringとして解析できるようにします。 | true |
|
input_format_json_read_arrays_as_strings |
JSON input formatsで、JSON arrayをStringとして解析できるようにします。 | true |
|
input_format_json_read_objects_as_strings |
JSON 入力フォーマットで JSON オブジェクトを文字列として解析できるようにします。 | true |
|
input_format_json_named_tuples_as_objects |
名前付きTupleのカラムを 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_strings |
JSON input formats のスキーマ推論時に、Null のみ、または空のオブジェクト/配列のみを含むキーには String 型を使用します。 | true |
|
input_format_json_defaults_for_missing_elements_in_named_tuple |
名前付きタプルのパース時に、JSON オブジェクト内で欠落している要素にデフォルト値を挿入します。 | true |
|
input_format_json_ignore_unknown_keys_in_named_tuple |
named tuple の JSON オブジェクト内にある不明なキーを無視します。 | false |
|
input_format_json_compact_allow_variable_number_of_columns |
JSONCompact/JSONCompactEachRow フォーマットでカラム数が可変であることを許可し、余分なカラムは無視し、欠落したカラムにはデフォルト値を使用します。 | false |
|
input_format_json_throw_on_bad_escape_sequence |
JSON 文字列に不正なエスケープシーケンスが含まれている場合、例外をスローします。無効にすると、不正なエスケープシーケンスはデータ内でそのまま保持されます。 | true |
|
input_format_json_empty_as_default |
JSON入力内の空のフィールドをデフォルト値として扱います。 | false. |
複雑なデフォルト式を使用する場合は、input_format_defaults_for_omitted_fields も有効にする必要があります。 |
output_format_json_quote_64bit_integers |
JSON出力フォーマットで64ビット整数を引用符で囲むかどうかを制御します。 | true |
|
output_format_json_quote_64bit_floats |
JSON出力フォーマットで64ビットFloatを引用符で囲むかどうかを制御します。 | false |
|
output_format_json_quote_denormals |
JSON 出力フォーマットで '+nan'、'-nan'、'+inf'、'-inf' を出力できるようにします。 | false |
|
output_format_json_quote_decimals |
JSON 出力フォーマットで decimal 値をクォートするかどうかを制御します。 | false |
|
output_format_json_escape_forward_slashes |
JSON 出力フォーマットで文字列を出力する際に、スラッシュをエスケープするかどうかを制御します。 | true |
|
output_format_json_named_tuples_as_objects |
名前付きタプルのカラムを JSON オブジェクトとしてシリアル化します。 | true |
|
output_format_json_array_of_rows |
JSONEachRow(Compact) フォーマットのすべての行を含む JSON 配列を出力します。 | false |
|
output_format_json_validate_utf8 |
JSON 出力フォーマットで UTF-8 シーケンスの検証を有効にします (JSON/JSONCompact/JSONColumnsWithMetadata フォーマットには影響せず、これらでは常に UTF-8 が検証されます) 。 | false |