Описание
Protobuf — это формат Protocol Buffers.
Для этого формата требуется внешняя схема, которая кэшируется между запросами.
ClickHouse поддерживает:
- оба синтаксиса:
proto2иproto3. - поля
Repeated/optional/required.
_ (подчёркивание) и . (точка) считаются эквивалентными.
Если типы столбца и поля сообщения Protocol Buffers различаются, применяется необходимое преобразование.
Поддерживаются вложенные сообщения. Например, для поля z в следующем типе сообщения:
x.y.z (или x_y_z, X.y_Z и так далее).
Вложенные сообщения подходят для ввода и вывода вложенных структур данных.
Значения по умолчанию, определённые в схеме protobuf, подобной приведённой ниже, не применяются; вместо них используются значения по умолчанию таблицы:
input_format_protobuf_oneof_presence, ClickHouse заполняет столбец, указывающий, какое поле oneof присутствует в сообщении.
input_format_protobuf_oneof_presence отключена
ClickHouse принимает и выводит protobuf-сообщения в формате с префиксом длины.
Это означает, что перед каждым сообщением его длина должна быть записана как целое число переменной длины (varint).
Пример использования
Чтение и запись данных
Файлы примераФайлы, используемые в этом примере, доступны в репозитории с примерами
protobuf_message.bin в таблицу ClickHouse. Затем запишем их
обратно в файл protobuf_message_from_clickhouse.bin в формате Protobuf.
Дан файл schemafile.proto:
Создание двоичного файла
Создание двоичного файла
Если вы уже знаете, как сериализовать и десериализовать данные в формате Теперь создайте новый Python-файл с именем Теперь запустите скрипт из командной строки. Рекомендуется запускать его в
виртуальном окружении Python, например с помощью Вам потребуется установить следующие Python-библиотеки:Запустите скрипт, чтобы создать двоичный файл:
Protobuf, можете пропустить этот шаг.Мы будем использовать Python, чтобы сериализовать данные в protobuf_message.bin и загрузить их в ClickHouse.
Если вы хотите использовать другой язык, см. также: “Как читать и записывать Protobuf-сообщения с префиксом длины на популярных языках”.Выполните следующую команду, чтобы создать Python-файл с именем schemafile_pb2.py в
том же каталоге, что и schemafile.proto. Этот файл содержит Python-классы,
представляющие ваше Protobuf-сообщение UserData:generate_protobuf_data.py в том же
каталоге, что и schemafile_pb2.py. Вставьте в него следующий код:uv:Protobuf:
protobuf_message_from_clickhouse.bin.
Чтение и запись данных с помощью ClickHouse Cloud
format_protobuf_schema,
чтобы указать схему в запросе. В этом примере мы покажем, как считать сериализованные данные с локальной
машины и вставить их в таблицу в ClickHouse Cloud.
Как и в предыдущем примере, создайте таблицу в ClickHouse Cloud в соответствии со схемой Protobuf:
format_schema_source задаёт источник для SETTING format_schema
Возможные значения:
- ‘file’ (по умолчанию): не поддерживается в Cloud
- ‘string’:
format_schemaсодержит буквальное содержимое схемы. - ‘query’:
format_schema— это запрос для получения схемы.
format_schema_source='string'
format_schema_source='query'
Использование автоматически созданной схемы
format_protobuf_use_autogenerated_schema.
Например:
structureToProtobufSchema. Затем эта схема будет использоваться для сериализации данных в формате Protobuf.
Вы также можете читать файл Protobuf с автоматически сгенерированной схемой. В этом случае файл должен быть создан с использованием той же схемы:
format_protobuf_use_autogenerated_schema включен по умолчанию и применяется, если format_schema не задан.
Вы также можете сохранять автоматически сгенерированную схему в файл при вводе и выводе данных, используя SETTING output_format_schema. Например:
path/to/schema/schema.capnp.
Очистка кэша protobuf
format_schema_path, используйте оператор SYSTEM DROP ... FORMAT CACHE.