Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

JSONObjectEachRow

入力 出力 エイリアス

説明

このフォーマットでは、すべてのデータが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 設定を使用します。

Querysql
SELECT * FROM test SETTINGS format_json_object_each_row_column_for_object_name='object_name'
Responsejson
{
    "first_obj": {"number": 1},
    "second_obj": {"number": 2},
    "third_obj": {"number": 3}
}

入力

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

Querysql
SELECT * FROM file('data.json', JSONObjectEachRow, 'object_name String, number UInt64') SETTINGS format_json_object_each_row_column_for_object_name='object_name'
Responseresponse
┌─object_name─┬─number─┐
│ first_obj   │      1 │
│ second_obj  │      2 │
│ third_obj   │      3 │
└─────────────┴────────┘

スキーマ推論にも利用できます:

Querysql
DESCRIBE file('data.json', JSONObjectEachRow) SETTING format_json_object_each_row_column_for_object_name='object_name'
Responseresponse
┌─name────────┬─type────────────┐
│ object_name │ String          │
│ number      │ Nullable(Int64) │
└─────────────┴─────────────────┘

データの挿入

Querysql
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 設定に応じて、異なる置き換えルールを使用します。

次のテーブルを考えます。

Querysql
CREATE TABLE IF NOT EXISTS example_table
(
    x UInt32,
    a DEFAULT x * 2
) ENGINE = Memory;
  • input_format_defaults_for_omitted_fields = 0 の場合、xa のデフォルト値はいずれも 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 設定を有効にすることで使用できます。

たとえば、次のテーブルを考えてみましょう。

Querysql
CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = Memory

Nested データ型の説明にあるとおり、ClickHouse ではネスト構造の各要素を個別のカラム (このテーブルでは n.sn.i) として扱います。データは次のように挿入できます。

Querysql
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 は例外をスローします。

Querysql
SELECT name, value FROM system.settings WHERE name = 'input_format_import_nested_json'
Responseresponse
┌─name────────────────────────────┬─value─┐
│ input_format_import_nested_json │ 0     │
└─────────────────────────────────┴───────┘
Querysql
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}
Responseresponse
Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: n: (at row 1)
Querysql
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
Responseresponse
┌─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
Navigation