メインコンテンツへスキップ
メインコンテンツへスキップ

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 設定を使用します。

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 を指定してデータを挿入すると、input_format_defaults_for_omitted_fields = 0 の場合と比べて、ClickHouse はより多くの計算リソースを消費します。

データの選択

例として、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]}}
コード: 117. DB::Exception: JSONEachRow形式の解析中に不明なフィールドが検出されました: n: (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_objectsNamedTuple 型の列を 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_tuplenamed 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 出力形式での 10 進数のクォート方法を制御します。false
output_format_json_escape_forward_slashesJSON 出力形式で、文字列中のスラッシュ (/) をエスケープするかどうかを制御します。true
output_format_json_named_tuples_as_objectsNamedTuple 型の列を JSON オブジェクトとしてシリアル化します。true
output_format_json_array_of_rowsすべての行を JSONEachRow(Compact) 形式の JSON 配列として出力します。false
output_format_json_validate_utf8JSON 出力フォーマットでの UTF-8 シーケンス検証を有効にします(ただし JSON/JSONCompact/JSONColumnsWithMetadata フォーマットには影響しません。これらは常に UTF-8 を検証します)。false