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 и так далее). Вложенные сообщения подходят для ввода и вывода вложенных структур данных. Значения по умолчанию, определённые в схеме protobuf, подобной приведённой ниже, не применяются; вместо них используются значения по умолчанию таблицы:
Если сообщение содержит 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) должен содержать все возможные теги 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.
Последнее изменение 23 июля 2026 г.