Protobuf
| Ввод | Вывод | Псевдоним |
|---|---|---|
| ✔ | ✔ |
Описание
Формат 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 и параметр 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, обозначающий отсутствие; строковые представления при этом неважны.
Настройка input_format_protobuf_oneof_presence по умолчанию отключена.
ClickHouse считывает и выводит сообщения protobuf в формате length-delimited.
Это означает, что перед каждым сообщением его длина должна быть записана как целое число переменной длины (varint).
Пример использования
Чтение и запись данных
Файлы, используемые в этом примере, можно найти в репозитории с примерами
В этом примере мы прочитаем данные из файла protobuf_message.bin в таблицу ClickHouse. Затем запишем их
обратно в файл protobuf_message_from_clickhouse.bin, используя формат Protobuf.
Имеется файл schemafile.proto:
Генерация бинарного файла
Если вы уже знаете, как сериализовать и десериализовать данные в формате Protobuf, можете пропустить этот шаг.
Мы будем использовать Python, чтобы сериализовать некоторые данные в файл protobuf_message.bin и затем прочитать их в ClickHouse.
Если вы хотите использовать другой язык, см. также: «How to read/write length-delimited Protobuf messages in popular languages».
Выполните следующую команду, чтобы сгенерировать 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. Однако вы можете использовать параметр format_protobuf_schema,
чтобы указать схему прямо в запросе. В этом примере показано, как читать сериализованные данные с вашей локальной
машины и вставлять их в таблицу в ClickHouse Cloud.
Как и в предыдущем примере, создайте таблицу в ClickHouse Cloud в соответствии с вашей Protobuf-схемой:
Параметр format_schema_source определяет источник значения параметра 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, используя автоматически сгенерированную схему. Для этого используйте настройку format_protobuf_use_autogenerated_schema.
Например:
В этом случае ClickHouse автоматически сгенерирует Protobuf-схему в соответствии со структурой таблицы с помощью функции
structureToProtobufSchema. Затем ClickHouse будет использовать эту схему для сериализации данных в формате Protobuf.
Вы также можете прочитать файл в формате Protobuf с автоматически сгенерированной схемой. В этом случае необходимо, чтобы файл был создан с использованием той же схемы:
Настройка format_protobuf_use_autogenerated_schema включена по умолчанию и применяется, если format_schema не задан.
Вы также можете сохранить автоматически сгенерированную схему в файл при вводе/выводе данных с помощью настройки output_format_schema. Например:
В этом случае автоматически сгенерированная схема Protobuf будет сохранена в файле path/to/schema/schema.capnp.
Сброс кэша Protobuf
Чтобы перезагрузить схему Protobuf, загруженную из format_schema_path, используйте оператор SYSTEM DROP ... FORMAT CACHE.