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

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 с двумя колонками:

┌─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]}}
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_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-объекте для именованных кортежей.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управляет экранированием 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, они всегда проверяют utf8).false