Перейти к основному содержанию
Перейти к основному содержанию

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:

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

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

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.
Примечание

При вставке данных при 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.

Справочные материалы

Любой набор байт может выводиться в строковых значениях. Используйте формат JSONEachRow, если вы уверены, что данные в таблице могут быть отформатированы как JSON без потери какой-либо информации.

Использование вложенных структур

Если у вас есть таблица со столбцами типа данных Nested, вы можете вставлять JSON-данные с той же структурой. Включите эту возможность с помощью настройки input_format_import_nested_json.

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

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

Как видно из описания типа данных Nested, 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]}}
Код: 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_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разбирать столбцы типа NamedTuple как JSON-объекты.true
input_format_json_try_infer_numbers_from_stringsпытаться распознавать числа в строковых полях при автоматическом определении схемы.false
input_format_json_try_infer_named_tuples_from_objectsпытаться выводить тип NamedTuple из 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-объекте для именованных кортежей.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управляет тем, будут ли десятичные числа заключаться в кавычки в выводе в формате 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