Descripción general
- Ejecutar consultas SQL y recuperar resultados en formato Apache Arrow.
- Insertar datos en tablas con el formato Arrow.
- Consultar metadatos (catálogos, esquemas, tablas y claves primarias) mediante comandos de Flight SQL.
- Crear, vincular, ejecutar y cerrar sentencias preparadas en el servidor mediante Flight SQL.
- Administrar sesiones y ajustes mediante acciones de Flight SQL.
- Cifrado TLS y autenticación mediante nombre de usuario y contraseña.
- Recuperación incremental de resultados mediante
PollFlightInfo. - Cancelación de consultas mediante
CancelFlightInfo.
Habilitar el servidor Arrow Flight
arrowflight_port a la configuración del servidor de ClickHouse:
Configuración de TLS
grpc+tls:// en lugar de grpc://.
Autenticación
Autenticación básica
Authorization: Basic. Tras autenticarse correctamente, el servidor devuelve un token Bearer en el encabezado de la respuesta.
Autenticación con token Bearer
Authorization: Bearer <token>. El token se renueva automáticamente con cada uso y caduca según la configuración del servidor default_session_timeout (valor predeterminado: 60 segundos).
Ejemplo de Python
Gestión de sesiones
| Header | Description |
|---|---|
x-clickhouse-session-id | Identificador de sesión. Si se proporciona, varias solicitudes comparten el mismo estado de sesión (tablas temporales, ajustes). |
x-clickhouse-session-timeout | Tiempo de espera de la sesión en segundos. No debe superar max_session_timeout. |
x-clickhouse-session-check | Establézcalo en 1 para comprobar si la sesión existe sin crearla. |
x-clickhouse-session-close | Establézcalo en 1 para cerrar la sesión una vez completada la solicitud. Requiere que enable_arrow_close_session sea true en la configuración del servidor. |
Como Arrow Flight usa gRPC sobre HTTP/2, los nombres de los encabezados de metadatos distinguen entre mayúsculas y minúsculas y deben especificarse en minúsculas exactamente como se muestra (por ejemplo,
x-clickhouse-session-id, no X-ClickHouse-Session-Id). Esto es obligatorio según la RFC 9113, Sección 8.2, que exige que los nombres de campo de HTTP/2 contengan únicamente caracteres en minúsculas. Esto difiere de HTTP/1.1, donde los nombres de los encabezados no distinguen entre mayúsculas y minúsculas.SetSessionOptions (consulte DoAction).
Referencia de la configuración del servidor
| Configuración | Predeterminado | Descripción |
|---|---|---|
arrowflight_port | — | Puerto del servidor Arrow Flight. El servidor solo se inicia si se especifica esta configuración. |
arrowflight.enable_ssl | false | Habilita el cifrado TLS. |
arrowflight.ssl_cert_file | — | Ruta al archivo del certificado TLS. Obligatorio cuando TLS está habilitado. |
arrowflight.ssl_key_file | — | Ruta al archivo de la clave privada TLS. Obligatorio cuando TLS está habilitado. |
arrowflight.tickets_lifetime_seconds | 600 | Tiempo, en segundos, antes de que los tickets de Flight expiren y se eliminen. Establezca 0 para desactivar la expiración automática de los tickets. |
arrowflight.cancel_ticket_after_do_get | false | Si es true, los tickets se cancelan inmediatamente después de ser consumidos por DoGet, lo que libera memoria. |
arrowflight.poll_descriptors_lifetime_seconds | 600 | Tiempo, en segundos, antes de que expiren los descriptores de sondeo. Establezca 0 para desactivar la expiración automática. |
arrowflight.cancel_flight_descriptor_after_poll_flight_info | false | Si es true, los descriptores de sondeo se cancelan después de ser consumidos por PollFlightInfo. |
arrowflight.max_prepared_statements_per_user | 100 | Número máximo de sentencias preparadas abiertas por usuario. Establezca 0 para desactivar el límite. |
arrowflight.prepared_statements_lifetime_seconds | -1 | Modo de duración de las sentencias preparadas. > 0: usa este valor como duración y renueva la expiración en cada solicitud, tanto para las sentencias asociadas a una sesión como para las que no tienen sesión. 0: desactiva la expiración automática. -1: para las sentencias asociadas a una sesión, usa el tiempo de espera de la sesión como duración y lo renueva en cada solicitud; las sentencias sin sesión no expiran automáticamente. |
enable_arrow_close_session | true | Permite a los clientes cerrar sesiones mediante el encabezado x-clickhouse-session-close. |
default_session_timeout | 60 | Tiempo de espera predeterminado de la sesión, en segundos. También controla la expiración del token Bearer. |
max_session_timeout | 3600 | Tiempo de espera máximo permitido de la sesión, en segundos. |
Métodos RPC compatibles
GetFlightInfo
FlightInfo que contiene el esquema del resultado, endpoints con tickets para recuperar los datos, el número de filas y la cantidad de bytes.
Acepta un FlightDescriptor, que puede ser:
- PATH descriptor: Una ruta de un solo componente interpretada como nombre de tabla. Genera
SELECT * FROM <table>. - CMD descriptor: Una cadena de consulta SQL sin procesar o un comando protobuf serializado de Flight SQL (consulta Comandos de Flight SQL).
PollFlightInfo
GetFlightInfo), PollFlightInfo devuelve los resultados bloque por bloque.
En la primera llamada, la consulta empieza a ejecutarse. La respuesta incluye:
- Un
FlightInfocon endpoints para todos los bloques de datos disponibles hasta ese momento. - Un
FlightDescriptorpara el siguiente sondeo (si se esperan más resultados).
La implementación actual se bloquea hasta que haya un bloque de datos disponible, en lugar de devolver de inmediato una respuesta sin datos.
GetSchema
GetFlightInfo.
DoGet
- Un ticket devuelto por
GetFlightInfooPollFlightInfo. - Una cadena con una consulta SQL sin procesar como valor del ticket.
DoPut
FlightDescriptor y un flujo de lotes de registros de Arrow.
Inserción por nombre de tabla (descriptor PATH):
CommandStatementUpdate:
Los clientes de Flight SQL usan CommandStatementUpdate para ejecutar sentencias DDL/DML (CREATE, INSERT, ALTER, etc.). La respuesta incluye el número de filas afectadas.
Ingesta masiva mediante Flight SQL CommandStatementIngest:
Solo se admite agregar datos a tablas existentes (TABLE_NOT_EXIST_OPTION_FAIL + TABLE_EXISTS_OPTION_APPEND). Los catálogos y las tablas temporales no son compatibles con este comando.
transaction_id no es compatible con CommandStatementUpdate ni con CommandStatementIngest. Si se proporciona, ClickHouse devuelve un error NotImplemented.
Solo se acepta el formato
Arrow para la transferencia de datos. Especificar otros formatos en SQL (por ejemplo, FORMAT JSON) genera un error.DoAction
CancelFlightInfo
FlightInfo. El ID de la consulta se extrae del campo app_metadata de FlightInfo. También cancela cualquier descriptor de sondeo asociado a la consulta.
SetSessionOptions
x-clickhouse-session-id.
Tipos de valores admitidos: string, boolean, integer, double y listas de string.
Si no se reconoce el nombre de una configuración, se devuelve el error INVALID_NAME. Si no se puede interpretar un valor, se devuelve el error INVALID_VALUE.
GetSessionOptions
system.settings internamente).
CreatePreparedStatement
?.
transaction_id no es compatible con esta acción. Si se proporciona, ClickHouse devuelve un error NotImplemented.
Para las sentencias de consulta, la respuesta puede incluir:
dataset_schema: esquema del conjunto de resultados.parameter_schema: esquema de los parámetros de la sentencia.
NULL no es válido para esa consulta), ClickHouse igualmente crea la sentencia preparada y devuelve el identificador sin dataset_schema.
Las sentencias preparadas pertenecen al usuario autenticado, no a una sola sesión. Si abre varias sesiones como el mismo usuario, puede ejecutar, volver a enlazar y cerrar el mismo identificador de sentencia desde cualquiera de esas sesiones.
Otros usuarios no pueden ejecutar, enlazar ni cerrar un identificador de sentencia que no hayan creado.
arrowflight.prepared_statements_lifetime_seconds controla el comportamiento de expiración:
> 0: usa el valor configurado como tiempo de vida de la sentencia. La expiración se renueva con cada solicitud, tanto para las sentencias vinculadas a una sesión como para las que no tienen sesión.0: las sentencias preparadas no expiran automáticamente.-1(predeterminado): si la sentencia se crea en una sesión, su tiempo de vida sigue el tiempo de espera de esa sesión y se renueva con cada solicitud de esa sesión. Si la sentencia se crea sin una sesión, no expira automáticamente.
arrowflight.max_prepared_statements_per_user.
ClosePreparedStatement
ClosePreparedStatement cuando el identificador está vacío:
- Si
x-clickhouse-session-idestá presente, cierra todas las sentencias preparadas del usuario autenticado en esa sesión. - Si no hay ningún ID de sesión, cierra solo las sentencias preparadas sin sesión del usuario autenticado.
x-clickhouse-session-id), también se cierra automáticamente cuando se cierra esa sesión.
Comandos de Flight SQL
CMD contiene un mensaje protobuf de Flight SQL serializado, ClickHouse admite los siguientes comandos:
Admitido a través de GetFlightInfo / GetSchema
| Comando | Descripción |
|---|---|
CommandStatementQuery | Ejecuta una consulta SQL arbitraria. transaction_id no es compatible. |
CommandGetSqlInfo | Recupera metadatos del servidor (nombre, versión, versión de Arrow y capacidades). |
CommandGetCatalogs | Enumera los catálogos. Devuelve un resultado vacío (ClickHouse no usa catálogos). |
CommandGetDbSchemas | Enumera las bases de datos. Admite db_schema_filter_pattern opcional (patrón SQL LIKE). |
CommandGetTables | Enumera las tablas. Admite filtros por esquema, nombre de tabla, tipos de tabla e inclusión opcional del esquema. |
CommandGetTableTypes | Enumera los tipos de motores de tabla (de system.table_engines). |
CommandGetPrimaryKeys | Recupera las columnas de la clave primaria de una tabla especificada. |
CommandPreparedStatementQuery | Ejecuta una sentencia preparada de tipo SELECT mediante identificador. |
Compatibles mediante DoPut
| Comando | Descripción |
|---|---|
CommandStatementUpdate | Ejecuta una sentencia DDL/DML (CREATE, INSERT, ALTER, etc.). Devuelve el número de filas afectadas. transaction_id no se admite. |
CommandStatementIngest | Inserta datos de Arrow de forma masiva en una tabla existente. Solo se admite el modo append. transaction_id no se admite. |
CommandPreparedStatementQuery | Vincula valores de parámetros para una sentencia preparada cuando se envía mediante DoPut y luego devuelve DoPutPreparedStatementResult con el identificador de la sentencia. Solo se acepta un conjunto de parámetros (una fila), y el número de valores vinculados debe coincidir exactamente con el número de marcadores de posición ?. |
CommandPreparedStatementUpdate | Ejecuta una sentencia DDL/DML preparada mediante su identificador y devuelve el número de filas afectadas. |
No admitido por ClickHouse
| Comando | Motivo |
|---|---|
CommandGetCrossReference | ClickHouse no es una base de datos relacional y no implementa restricciones de clave foránea, por lo que los metadatos de referencias cruzadas no están disponibles. |
CommandGetExportedKeys | ClickHouse no es una base de datos relacional y no implementa restricciones de clave foránea, por lo que los metadatos de claves exportadas no están disponibles. |
CommandGetImportedKeys | ClickHouse no es una base de datos relacional y no implementa restricciones de clave foránea, por lo que los metadatos de claves importadas no están disponibles. |
CommandStatementSubstraitPlan | ClickHouse no admite planes Substrait. |
Ejemplo completo
Query
Response
Formato de datos
Arrow; si se especifican otros formatos de ClickHouse (por ejemplo, FORMAT JSON, FORMAT CSV), se produce un error.
Los tipos de datos de ClickHouse se asignan a tipos de Arrow durante la serialización. La configuración output_format_arrow_unsupported_types_as_binary controla si los tipos de ClickHouse no compatibles se serializan como blobs binarios.
Compatibilidad
- Python (
pyarrow) - Java (
org.apache.arrow.flight) - C++ (
arrow::flight) - Go (
apache/arrow/go) - controladores ADBC (Arrow Database Connectivity)
- DBeaver y otras herramientas compatibles con Flight SQL