Descripción
El formatoProtobuf es el formato de Protocol Buffers.
Este formato requiere un esquema de formato externo, que se mantiene en caché entre consultas.
ClickHouse admite:
- tanto la sintaxis
proto2como laproto3. - campos
Repeated/optional/required.
_ (guion bajo) y . (punto) se consideran equivalentes.
Si los tipos de una columna y de un campo del mensaje de Protocol Buffers son diferentes, se aplica la conversión necesaria.
Se admiten mensajes anidados. Por ejemplo, para el campo z en el siguiente tipo de mensaje:
x.y.z (o x_y_z, X.y_Z, etc.).
Los mensajes anidados son adecuados para la entrada o salida de estructuras de datos anidadas.
Para los campos asignados que no están presentes en los datos transmitidos:
- Las columnas asignadas ordinarias no anulables usan el valor predeterminado del campo del esquema protobuf (
proto2[default = …]; de lo contrario, el valor predeterminado del tipo) durante el análisis, no la expresiónDEFAULTde la tabla. - Las columnas asignadas
Nullable(...)se resuelven comoNULLcuando el campo está ausente (no toman el valor predeterminado del campo o tipo protobuf). - Con
input_format_protobuf_flatten_google_wrappershabilitado para los envoltoriosgoogle.protobuf.*Value:- un envoltorio ausente en una columna
Nullable(...)se trata como un campo externo ausente y se convierte enNULL; - un envoltorio presente pero vacío (
str {}) conserva el valor predeterminado del escalar anidado (''/0); - una columna no anulable asignada a un envoltorio ausente obtiene el valor predeterminado del escalar anidado en lugar de
NULL.
- un envoltorio ausente en una columna
DEFAULT de la tabla (y las expresiones predeterminadas) se aplican a las columnas de la tabla que no tienen ningún campo coincidente en el tipo de mensaje cuando input_format_defaults_for_omitted_fields está habilitado (de forma predeterminada). Si ese SETTING es 0, las columnas no asignadas conservan el valor predeterminado del tipo de datos insertado durante el análisis en lugar de la expresión DEFAULT de la tabla.
Ejemplo de un valor predeterminado de campo de un esquema proto2 (usado para un campo asignado ausente del mensaje):
input_format_protobuf_oneof_presence, ClickHouse completa la columna que indica qué campo de oneof se encontró.
oneof.
Se admiten mensajes anidados (consulte ejemplos básicos). Los mensajes vacíos también se admiten.
Los tipos permitidos son Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Enum, Enum8 o Enum16.
Enum (así como Enum8 o Enum16) debe contener 0 para indicar ausencia y la etiqueta de cada caso de oneof que tenga una columna coincidente en la tabla de destino; las representaciones textuales no importan.
Para los miembros de mensajes oneof sin columnas coincidentes en la tabla, también se permiten etiquetas Enum faltantes. Si dicha rama está presente en la entrada, ClickHouse trata la presencia de oneof como omitida y escribe 0 en la columna de presencia.
El SETTING input_format_protobuf_oneof_presence está deshabilitado de forma predeterminada
ClickHouse recibe y envía mensajes protobuf en formato length-delimited.
Esto significa que, antes de cada mensaje, su longitud debe escribirse como un entero de longitud variable (varint).
Ejemplo de uso
Lectura y escritura de datos
Los archivos usados en este ejemplo están disponibles en el repositorio de ejemplos
protobuf_message.bin a una tabla de ClickHouse. Luego los volveremos a escribir
en un archivo llamado protobuf_message_from_clickhouse.bin usando el formato Protobuf.
Dado el archivo schemafile.proto:
Generar el archivo binario
Generar el archivo binario
Si ya sabes cómo serializar y deserializar datos en el formato Ahora, crea un nuevo archivo Python llamado Ahora ejecuta el script desde la línea de comandos. Se recomienda ejecutarlo desde un
entorno virtual de Python, por ejemplo con Tendrás que instalar las siguientes bibliotecas de Python:Ejecuta el script para generar el archivo binario:
Protobuf, puedes omitir este paso.Usaremos Python para serializar algunos datos en protobuf_message.bin y leerlos en ClickHouse.
Si quieres usar otro lenguaje, consulta también: “How to read/write length-delimited Protobuf messages in popular languages”.Ejecuta el siguiente comando para generar un archivo Python llamado schemafile_pb2.py en
el mismo directorio que schemafile.proto. Este archivo contiene las clases de Python
que representan tu mensaje UserData de Protobuf:generate_protobuf_data.py en el mismo
directorio que schemafile_pb2.py. Pega el siguiente código en él:uv:Protobuf:
protobuf_message_from_clickhouse.bin.
Lectura y escritura de datos con ClickHouse Cloud
Con ClickHouse Cloud no es posible cargar un archivo de esquema Protobuf. Sin embargo, puede usar la configuraciónformat_protobuf_schema
para especificar el esquema en la consulta. En este ejemplo, le mostramos cómo leer datos serializados desde su máquina local
e insertarlos en una tabla de ClickHouse Cloud.
Como en el ejemplo anterior, cree la tabla según el esquema de su archivo Protobuf en ClickHouse Cloud:
format_schema_source define la fuente de la configuración format_schema
Valores posibles:
- ‘file’ (predeterminado): no es compatible con Cloud
- ‘string’:
format_schemaes el contenido literal del esquema. - ‘query’:
format_schemaes una consulta para obtener el esquema.
format_schema_source='string'
Inserte los datos en ClickHouse Cloud, especificando el esquema como una cadena; ejecute:
format_schema_source='query'
También puede almacenar su esquema Protobuf en una tabla.
Cree una tabla en ClickHouse Cloud para insertar datos:
Uso de un esquema autogenerado
Si no dispone de un esquema Protobuf externo para sus datos, aún puede exportar/importar datos en formato Protobuf mediante un esquema autogenerado. Para ello, utilice la configuraciónformat_protobuf_use_autogenerated_schema.
Por ejemplo:
structureToProtobufSchema. A continuación, usará este esquema para serializar los datos en formato Protobuf.
También puede leer un archivo Protobuf con el esquema autogenerado. En este caso, es necesario que el archivo se haya creado con el mismo esquema:
format_protobuf_use_autogenerated_schema está habilitada de forma predeterminada y se aplica si no se ha establecido format_schema.
También puede guardar el esquema autogenerado en el archivo durante la entrada/salida mediante la configuración output_format_schema. Por ejemplo:
path/to/schema/schema.capnp.
Eliminar la caché de Protobuf
Para recargar el esquema Protobuf cargado desdeformat_schema_path, use la sentencia SYSTEM DROP ... FORMAT CACHE.