Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

JSONObjectEachRow

Входной Выходной Псевдоним

Описание

В этом формате все данные представлены в виде одного объекта 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 с двумя столбцами:

┌─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 игнорирует пробелы между элементами и запятые после объектов. Все объекты можно передать в одной строке. Разделять их переводами строк не обязательно.

Обработка пропущенных значений

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, то значение по умолчанию для x и a равно 0 (это значение по умолчанию для типа данных UInt32).
  • Если input_format_defaults_for_omitted_fields = 1, то значение по умолчанию для x равно 0, а для ax * 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, вы можете вставлять JSON-данные с той же структурой. Чтобы включить эту возможность, используйте настройку input_format_import_nested_json.

Например, рассмотрим следующую таблицу:

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

Как видно из описания типа данных Nested, ClickHouse рассматривает каждый элемент вложенной структуры как отдельный столбец (n.s и n.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. true
input_format_json_read_bools_as_strings разрешить обрабатывать логические значения как строки во входных форматах JSON. true
input_format_json_read_numbers_as_strings разрешить обрабатывать числа как строки во входных форматах JSON. true
input_format_json_read_arrays_as_strings разрешить обрабатывать JSON-массивы как строки во входных форматах JSON. true
input_format_json_read_objects_as_strings разрешить разбирать объекты JSON как строки во входных форматах 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_strings использовать тип String для ключей, содержащих только значения NULL или пустые объекты/массивы, при выводе схемы во входных форматах JSON. true
input_format_json_defaults_for_missing_elements_in_named_tuple вставлять значения по умолчанию для отсутствующих элементов объекта JSON при разборе именованного кортежа. true
input_format_json_ignore_unknown_keys_in_named_tuple игнорировать неизвестные ключи в объекте JSON для именованных Tuple. false
input_format_json_compact_allow_variable_number_of_columns разрешить переменное количество столбцов в формате JSONCompact/JSONCompactEachRow, игнорировать лишние столбцы и использовать значения по умолчанию для отсутствующих столбцов. false
input_format_json_throw_on_bad_escape_sequence сгенерировать исключение, если JSON-строка содержит недопустимую escape-последовательность. Если отключено, недопустимые escape-последовательности останутся в данных без изменений. true
input_format_json_empty_as_default обрабатывать пустые поля во входных JSON-данных как значения по умолчанию. false. Для сложных выражений по умолчанию также должен быть включен параметр input_format_defaults_for_omitted_fields.
output_format_json_quote_64bit_integers управляет заключением 64-битных целых чисел в кавычки в формате вывода JSON. true
output_format_json_quote_64bit_floats управляет заключением 64-битных чисел с плавающей запятой в кавычки в формате вывода JSON. false
output_format_json_quote_denormals включает вывод '+nan', '-nan', '+inf', '-inf' в формате вывода JSON. false
output_format_json_quote_decimals управляет заключением decimal-значений в кавычки в формате вывода JSON. false
output_format_json_escape_forward_slashes управляет экранированием прямых слешей в строковом выводе в формате вывода JSON. true
output_format_json_named_tuples_as_objects сериализует столбцы именованных кортежей в объекты JSON. true
output_format_json_array_of_rows выводит JSON-массив всех строк в формате JSONEachRow(Compact). false
output_format_json_validate_utf8 включает проверку последовательностей UTF-8 в форматах вывода JSON (обратите внимание, что это не влияет на форматы JSON/JSONCompact/JSONColumnsWithMetadata: в них проверка UTF-8 выполняется всегда). false
Navigation