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

JSONObjectEachRow

InputOutputAlias

説明

このフォーマットでは、すべてのデータが単一の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の場合、xaのデフォルト値は0UInt32データ型のデフォルト値)に等しくなります。
  • 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テーブルを例に考えてみましょう:

┌──────────────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の場合と同様にエスケープされます。

参考

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

ネストされた構造の使用

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

例えば、次のテーブルを考えてみましょう:

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

Nestedデータ型の説明に見られるように、ClickHouseはネストされた構造の各コンポーネントを別々のカラム(当テーブルではn.sn.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_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入力フォーマットにおいてNullまたは空のオブジェクト/配列のみを含むキーに対して、スキーマ推論中に型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フォーマットには影響しないことに注意してください。常にUTF-8がバリデートされます)。false