Описание
Protobuf — это формат Protocol Buffers.
Для этого формата требуется внешняя схема, которая кэшируется между запросами.
ClickHouse поддерживает:
- оба синтаксиса:
proto2иproto3. - поля
Repeated/optional/required.
_ (подчёркивание) и . (точка) считаются эквивалентными.
Если типы столбца и поля сообщения Protocol Buffers различаются, применяется необходимое преобразование.
Поддерживаются вложенные сообщения. Например, для поля z в следующем типе сообщения:
x.y.z (или x_y_z, X.y_Z и так далее).
Вложенные сообщения подходят для ввода и вывода вложенных структур данных.
Для сопоставленных полей, отсутствующих в передаваемых данных:
- Обычные не допускающие NULL сопоставленные столбцы при разборе используют значение по умолчанию поля из схемы protobuf (
proto2[default = …], в противном случае — значение по умолчанию типа), а не выражениеDEFAULTтаблицы. - Сопоставленные столбцы
Nullable(...)получают значениеNULL, если поле отсутствует (они не используют значение по умолчанию поля или типа protobuf). - Если для обёрток
google.protobuf.*Valueвключён SETTINGinput_format_protobuf_flatten_google_wrappers:- отсутствующая обёртка в столбце
Nullable(...)рассматривается как отсутствующее внешнее поле и становитсяNULL; - присутствующая, но пустая обёртка (
str {}) сохраняет значение по умолчанию вложенного скаляра (''/0); - не допускающий NULL столбец, сопоставленный с отсутствующей обёрткой, получает значение по умолчанию вложенного скаляра, а не
NULL.
- отсутствующая обёртка в столбце
DEFAULT таблицы (и выражения по умолчанию) применяются к столбцам таблицы, для которых нет соответствующего поля в типе сообщения, если включён SETTING input_format_defaults_for_omitted_fields (по умолчанию). Если значение этого SETTING равно 0, несопоставленные столбцы сохраняют значение по умолчанию типа данных, вставленное во время разбора, вместо выражения DEFAULT таблицы.
Пример значения по умолчанию поля схемы proto2 (используется для сопоставленного поля, отсутствующего в сообщении):
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.