Protobuf
| Входные данные | Выходные данные | Псевдоним |
|---|---|---|
| ✔ | ✔ |
Описание
Формат Protobuf является форматом Protocol Buffers.
Этот формат требует внешней схемы формата, которая кэшируется между запросами.
ClickHouse поддерживает:
- синтаксисы
proto2иproto3. - поля
Repeated/optional/required.
Пример использования
Основные примеры
Примеры использования:
Где файл schemafile.proto выглядит следующим образом:
Чтобы найти соответствие между колонками таблицы и полями типа сообщения 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 с длиной-разделителем на популярных языках.
Использование сгенерированной схемы
Если у вас нет внешней схемы Protobuf для ваших данных, вы все равно можете вводить/выводить данные в формате Protobuf, используя сгенерированную схему.
Например:
В этом случае ClickHouse будет автоматически генерировать схему Protobuf в соответствии с структурой таблицы с помощью функции structureToProtobufSchema.
Затем он будет использовать эту схему для сериализации данных в формате Protobuf.
Вы также можете прочитать файл Protobuf с autogenerated схемой. В этом случае необходимо, чтобы файл был создан с использованием той же схемы:
Настройка 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.