Skip to main content

Descripción

El formato Protobuf 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 proto2 como la proto3.
  • campos Repeated/optional/required.
Para encontrar la correspondencia entre las columnas de la tabla y los campos del tipo de mensaje de Protocol Buffers, ClickHouse compara sus nombres. Esta comparación no distingue entre mayúsculas y minúsculas, y los caracteres _ (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:
ClickHouse intenta encontrar una columna llamada 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ón DEFAULT de la tabla.
  • Las columnas asignadas Nullable(...) se resuelven como NULL cuando el campo está ausente (no toman el valor predeterminado del campo o tipo protobuf).
  • Con input_format_protobuf_flatten_google_wrappers habilitado para los envoltorios google.protobuf.*Value:
    • un envoltorio ausente en una columna Nullable(...) se trata como un campo externo ausente y se convierte en NULL;
    • 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.
El 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):
Si un mensaje contiene oneof y se establece input_format_protobuf_oneof_presence, ClickHouse completa la columna que indica qué campo de oneof se encontró.
El nombre de la columna que indica la presencia debe ser el mismo que el de 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
En este ejemplo, leeremos algunos datos de un archivo 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:
Si ya sabes cómo serializar y deserializar datos en el formato 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:
Ahora, crea un nuevo archivo Python llamado generate_protobuf_data.py en el mismo directorio que schemafile_pb2.py. Pega el siguiente código en él:
Ahora ejecuta el script desde la línea de comandos. Se recomienda ejecutarlo desde un entorno virtual de Python, por ejemplo con uv:
Tendrás que instalar las siguientes bibliotecas de Python:
Ejecuta el script para generar el archivo binario:
Crea una tabla de ClickHouse que coincida con el esquema:
Inserte los datos en la tabla desde la línea de comandos:
También puede volver a escribir los datos en un archivo binario con el formato Protobuf:
Con el esquema Protobuf, ahora puede deserializar los datos que se escribieron desde ClickHouse en el archivo 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ón format_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:
La configuración format_schema_source define la fuente de la configuración format_schema Valores posibles:
  • ‘file’ (predeterminado): no es compatible con Cloud
  • ‘string’: format_schema es el contenido literal del esquema.
  • ‘query’: format_schema es una consulta para obtener el esquema.

format_schema_source='string'

Inserte los datos en ClickHouse Cloud, especificando el esquema como una cadena; ejecute:
Seleccione los datos insertados en la tabla:

format_schema_source='query'

También puede almacenar su esquema Protobuf en una tabla. Cree una tabla en ClickHouse Cloud para insertar datos:
Inserta los datos en ClickHouse Cloud especificando el esquema en la consulta que se va a ejecutar:
Seleccione los datos insertados en la tabla:

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ón format_protobuf_use_autogenerated_schema. Por ejemplo:
En este caso, ClickHouse generará automáticamente el esquema de Protobuf según la estructura de la tabla mediante la función 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:
La configuración 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:
En este caso, el esquema de Protobuf autogenerado se guardará en el archivo path/to/schema/schema.capnp.

Eliminar la caché de Protobuf

Para recargar el esquema Protobuf cargado desde format_schema_path, use la sentencia SYSTEM DROP ... FORMAT CACHE.
Última modificación el 26 de septiembre de 2026