Skip to main content

Описание

Формат Protobuf — это формат Protocol Buffers. Для этого формата требуется внешняя схема, которая кэшируется между запросами. ClickHouse поддерживает:
  • оба синтаксиса: proto2 и proto3.
  • поля Repeated/optional/required.
Чтобы установить соответствие между столбцами таблицы и полями типа сообщения Protocol Buffers, ClickHouse сравнивает их имена. Это сравнение регистронезависимо, а символы _ (подчёркивание) и . (точка) считаются эквивалентными. Если типы столбца и поля сообщения Protocol Buffers различаются, применяется необходимое преобразование. Поддерживаются вложенные сообщения. Например, для поля z в следующем типе сообщения:
ClickHouse пытается найти столбец с именем x.y.z (или x_y_z, X.y_Z и так далее). Вложенные сообщения подходят для ввода и вывода вложенных структур данных. Для сопоставленных полей, отсутствующих в передаваемых данных:
  • Обычные не допускающие NULL сопоставленные столбцы при разборе используют значение по умолчанию поля из схемы protobuf (proto2 [default = …], в противном случае — значение по умолчанию типа), а не выражение DEFAULT таблицы.
  • Сопоставленные столбцы Nullable(...) получают значение NULL, если поле отсутствует (они не используют значение по умолчанию поля или типа protobuf).
  • Если для обёрток google.protobuf.*Value включён SETTING input_format_protobuf_flatten_google_wrappers:
    • отсутствующая обёртка в столбце Nullable(...) рассматривается как отсутствующее внешнее поле и становится NULL;
    • присутствующая, но пустая обёртка (str {}) сохраняет значение по умолчанию вложенного скаляра ('' / 0);
    • не допускающий NULL столбец, сопоставленный с отсутствующей обёрткой, получает значение по умолчанию вложенного скаляра, а не NULL.
DEFAULT таблицы (и выражения по умолчанию) применяются к столбцам таблицы, для которых нет соответствующего поля в типе сообщения, если включён SETTING input_format_defaults_for_omitted_fields (по умолчанию). Если значение этого SETTING равно 0, несопоставленные столбцы сохраняют значение по умолчанию типа данных, вставленное во время разбора, вместо выражения DEFAULT таблицы. Пример значения по умолчанию поля схемы proto2 (используется для сопоставленного поля, отсутствующего в сообщении):
Если сообщение содержит oneof и задан SETTING input_format_protobuf_oneof_presence, ClickHouse заполняет столбец, указывающий, какое поле oneof присутствует в сообщении.
Имя столбца, указывающего на наличие, должно совпадать с именем oneof. Вложенные сообщения поддерживаются (см. basic-examples). Пустые сообщения тоже поддерживаются. Допустимые типы: Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Enum, Enum8 или Enum16. Enum (а также Enum8 или Enum16) должен содержать 0 для обозначения отсутствия и тег каждого варианта oneof, имеющего соответствующий столбец в целевой таблице; строковые представления значения не имеют. Для членов сообщения oneof без соответствующих столбцов таблицы также допускается отсутствие тегов Enum. Если такой вариант присутствует во входных данных, ClickHouse считает наличие oneof неуказанным и записывает 0 в столбец наличия. По умолчанию SETTING input_format_protobuf_oneof_presence отключена ClickHouse принимает и выводит protobuf-сообщения в формате с префиксом длины. Это означает, что перед каждым сообщением его длина должна быть записана как целое число переменной длины (varint).

Пример использования

Чтение и запись данных

Файлы примераФайлы, используемые в этом примере, доступны в репозитории с примерами
В этом примере мы прочитаем данные из файла protobuf_message.bin в таблицу ClickHouse. Затем запишем их обратно в файл protobuf_message_from_clickhouse.bin в формате Protobuf. Дан файл schemafile.proto:
Если вы уже знаете, как сериализовать и десериализовать данные в формате Protobuf, можете пропустить этот шаг.Мы будем использовать Python, чтобы сериализовать данные в protobuf_message.bin и загрузить их в ClickHouse. Если вы хотите использовать другой язык, см. также: “Как читать и записывать Protobuf-сообщения с префиксом длины на популярных языках”.Выполните следующую команду, чтобы создать Python-файл с именем schemafile_pb2.py в том же каталоге, что и schemafile.proto. Этот файл содержит Python-классы, представляющие ваше Protobuf-сообщение UserData:
Теперь создайте новый Python-файл с именем generate_protobuf_data.py в том же каталоге, что и schemafile_pb2.py. Вставьте в него следующий код:
Теперь запустите скрипт из командной строки. Рекомендуется запускать его в виртуальном окружении Python, например с помощью uv:
Вам потребуется установить следующие Python-библиотеки:
Запустите скрипт, чтобы создать двоичный файл:
Создайте таблицу ClickHouse, соответствующую схеме:
Вставьте данные в таблицу с помощью командной строки:
Вы также можете записать данные обратно в двоичный файл в формате Protobuf:
Имея схему Protobuf, теперь вы можете десериализовать данные, записанные ClickHouse в файл protobuf_message_from_clickhouse.bin.

Чтение и запись данных с помощью ClickHouse Cloud

В ClickHouse Cloud нельзя загрузить файл схемы Protobuf. Однако можно использовать SETTING format_protobuf_schema, чтобы указать схему в запросе. В этом примере мы покажем, как считать сериализованные данные с локальной машины и вставить их в таблицу в ClickHouse Cloud. Как и в предыдущем примере, создайте таблицу в ClickHouse Cloud в соответствии со схемой Protobuf:
SETTING format_schema_source задаёт источник для SETTING format_schema Возможные значения:
  • ‘file’ (по умолчанию): не поддерживается в Cloud
  • ‘string’: format_schema содержит буквальное содержимое схемы.
  • ‘query’: format_schema — это запрос для получения схемы.

format_schema_source='string'

Чтобы выполнить вставку данных в ClickHouse Cloud, указав схему строкой, выполните:
Выберите вставленные в таблицу данные:

format_schema_source='query'

Вы также можете хранить схему Protobuf в таблице. Создайте в ClickHouse Cloud таблицу, в которую будут вставляться данные:
Вставьте данные в ClickHouse Cloud, указав схему в запросе, который нужно выполнить:
Выберите данные, которые были вставлены в таблицу:

Использование автоматически сгенерированной схемы

Если у вас нет внешней схемы Protobuf для ваших данных, вы всё равно можете выводить и читать данные в формате Protobuf, используя автоматически сгенерированную схему. Для этого используйте SETTING format_protobuf_use_autogenerated_schema. Например:
В этом случае ClickHouse автоматически сгенерирует схему Protobuf в соответствии со структурой таблицы с помощью функции structureToProtobufSchema. Затем эта схема будет использоваться для сериализации данных в формате Protobuf. Вы также можете читать файл Protobuf с автоматически сгенерированной схемой. В этом случае файл должен быть создан с использованием той же схемы:
SETTING format_protobuf_use_autogenerated_schema включен по умолчанию и применяется, если format_schema не задан. Вы также можете сохранять автоматически сгенерированную схему в файл при вводе и выводе данных, используя SETTING output_format_schema. Например:
В этом случае автоматически сгенерированная схема Protobuf будет сохранена в файле path/to/schema/schema.capnp.

Очистка кэша protobuf

Чтобы перезагрузить схему Protobuf, загруженную из format_schema_path, используйте оператор SYSTEM DROP ... FORMAT CACHE.
Последнее изменение 14 августа 2026 г.