Visão geral
- Executar consultas SQL e recuperar resultados no formato Apache Arrow.
- Inserir dados em tabelas usando o formato Arrow.
- Consultar metadados (catálogos, esquemas, tabelas, chaves primárias) por meio de comandos do Flight SQL.
- Criar, vincular, executar e fechar instruções preparadas no servidor por meio do Flight SQL.
- Gerenciar sessões e configurações por meio de ações do Flight SQL.
- Criptografia com TLS e autenticação com nome de usuário e senha.
- Recuperação incremental de resultados por meio de
PollFlightInfo. - Cancelamento de consultas por meio de
CancelFlightInfo.
Habilitando o Arrow Flight Server
arrowflight_port à configuração do servidor ClickHouse:
Configuração de TLS
grpc+tls:// em vez de grpc://.
Autenticação
Autenticação básica
Authorization: Basic. Após a autenticação bem-sucedida, o servidor retorna um token Bearer no cabeçalho da resposta.
Autenticação com Bearer Token
Authorization: Bearer <token>. O token é renovado automaticamente a cada uso e expira com base na configuração do servidor default_session_timeout (padrão: 60 segundos).
Exemplo em Python
Gerenciamento de sessões
| Cabeçalho | Descrição |
|---|---|
x-clickhouse-session-id | Identificador da sessão. Se fornecido, várias requisições compartilham o mesmo estado da sessão (tabelas temporárias, configurações). |
x-clickhouse-session-timeout | Tempo limite da sessão em segundos. Não deve exceder max_session_timeout. |
x-clickhouse-session-check | Defina como 1 para verificar se a sessão existe sem criar uma. |
x-clickhouse-session-close | Defina como 1 para encerrar a sessão após a conclusão da requisição. Exige que enable_arrow_close_session esteja definido como true na configuração do servidor. |
Como o Arrow Flight usa gRPC sobre HTTP/2, os nomes dos cabeçalhos de metadados diferenciam maiúsculas de minúsculas e devem ser especificados em minúsculas, exatamente como mostrado (por exemplo,
x-clickhouse-session-id, e não X-ClickHouse-Session-Id). Isso é exigido pela RFC 9113, Seção 8.2, que determina que os nomes dos campos em HTTP/2 contenham apenas caracteres minúsculos. Isso difere do HTTP/1.1, em que os nomes dos cabeçalhos não diferenciam maiúsculas de minúsculas.SetSessionOptions (consulte DoAction).
Referência de configuração do servidor
| Configuração | Padrão | Descrição |
|---|---|---|
arrowflight_port | — | Porta do servidor Arrow Flight. O servidor só é iniciado se esta configuração for especificada. |
arrowflight.enable_ssl | false | Habilita a criptografia TLS. |
arrowflight.ssl_cert_file | — | Caminho para o arquivo de certificado TLS. Obrigatório quando o TLS está habilitado. |
arrowflight.ssl_key_file | — | Caminho para o arquivo de chave privada TLS. Obrigatório quando o TLS está habilitado. |
arrowflight.tickets_lifetime_seconds | 600 | Tempo, em segundos, até que os tickets do Flight expirem e sejam removidos. Defina como 0 para desabilitar a expiração automática dos tickets. |
arrowflight.cancel_ticket_after_do_get | false | Se true, os tickets são cancelados imediatamente após serem consumidos por DoGet, liberando memória. |
arrowflight.poll_descriptors_lifetime_seconds | 600 | Tempo, em segundos, até que os descritores de polling expirem. Defina como 0 para desabilitar a expiração automática. |
arrowflight.cancel_flight_descriptor_after_poll_flight_info | false | Se true, os descritores de polling são cancelados após serem consumidos por PollFlightInfo. |
arrowflight.max_prepared_statements_per_user | 100 | Número máximo de instruções preparadas abertas por usuário. Defina como 0 para desabilitar o limite. |
arrowflight.prepared_statements_lifetime_seconds | -1 | Modo de duração das instruções preparadas. > 0: usa este valor como tempo de vida e renova a expiração a cada solicitação, tanto para instruções vinculadas à sessão quanto para instruções sem sessão. 0: desabilita a expiração automática. -1: para instruções vinculadas à sessão, usa o timeout da sessão como tempo de vida e o renova a cada solicitação; instruções sem sessão não expiram automaticamente. |
enable_arrow_close_session | true | Permite que os clientes fechem sessões por meio do cabeçalho x-clickhouse-session-close. |
default_session_timeout | 60 | Timeout padrão da sessão, em segundos. Também controla a expiração do token Bearer. |
max_session_timeout | 3600 | Timeout máximo permitido da sessão, em segundos. |
Métodos RPC suportados
GetFlightInfo
FlightInfo contendo o esquema do resultado, endpoints com tickets para recuperação de dados, contagem de linhas e de bytes.
Aceita um FlightDescriptor, que pode ser:
- descritor PATH: Um path de um único componente interpretado como nome de tabela. Gera
SELECT * FROM <table>. - descritor CMD: Uma string bruta de consulta SQL ou um comando protobuf Flight SQL serializado (consulte Flight SQL Commands).
PollFlightInfo
GetFlightInfo), o PollFlightInfo retorna os resultados bloco a bloco.
Na primeira chamada, a consulta começa a ser executada. A resposta inclui:
- Um
FlightInfocom endpoints para quaisquer blocos de dados disponíveis até aquele momento. - Um
FlightDescriptorpara a próxima verificação (se houver expectativa de mais resultados).
A implementação atual bloqueia até que um bloco de dados esteja disponível, em vez de retornar imediatamente sem dados.
GetSchema
GetFlightInfo.
DoGet
- Um ticket retornado por
GetFlightInfoouPollFlightInfo. - Uma string bruta de consulta SQL como valor do ticket.
DoPut
FlightDescriptor e um fluxo de lotes de registros Arrow.
Insert por nome da tabela (descritor PATH):
CommandStatementUpdate:
Clientes Flight SQL usam CommandStatementUpdate para executar instruções DDL/DML (CREATE, INSERT, ALTER etc.). A resposta inclui a contagem de linhas afetadas.
Ingestão em massa via Flight SQL CommandStatementIngest:
Só há suporte para anexar a tabelas existentes (TABLE_NOT_EXIST_OPTION_FAIL + TABLE_EXISTS_OPTION_APPEND). Catálogos e tabelas temporárias não são compatíveis com este comando.
transaction_id não tem suporte em CommandStatementUpdate nem em CommandStatementIngest. Se for fornecido, o ClickHouse retorna um erro NotImplemented.
Somente o formato
Arrow é aceito para transferência de dados. Especificar outros formatos em SQL (por exemplo, FORMAT JSON) resulta em um erro.DoAction
CancelFlightInfo
FlightInfo. O ID da consulta é extraído do campo app_metadata de FlightInfo. Também cancela todos os descritores de polling associados à consulta.
SetSessionOptions
x-clickhouse-session-id.
Tipos de valor compatíveis: string, booleano, inteiro, double e listas de strings.
Se o nome de uma configuração for desconhecido, o erro INVALID_NAME será retornado. Se um valor não puder ser interpretado, o erro INVALID_VALUE será retornado.
GetSessionOptions
system.settings internamente).
CreatePreparedStatement
?.
transaction_id não tem suporte nesta ação. Se for fornecido, o ClickHouse retorna um erro NotImplemented.
Para instruções de consulta, a resposta pode incluir:
dataset_schema: esquema do conjunto de resultados.parameter_schema: esquema dos parâmetros da instrução.
NULL não for válido para essa consulta), o ClickHouse ainda cria a instrução preparada e retorna o identificador sem dataset_schema.
As instruções preparadas pertencem ao usuário autenticado, não a uma única sessão. Se você abrir várias sessões como o mesmo usuário, poderá executar, refazer o bind e fechar o mesmo identificador de instrução em qualquer uma dessas sessões.
Outros usuários não podem executar, fazer bind nem fechar um identificador de instrução que não tenham criado.
arrowflight.prepared_statements_lifetime_seconds controla o comportamento de expiração:
> 0: usa o valor configurado como tempo de vida da instrução. A expiração é renovada a cada solicitação, tanto para instruções vinculadas a sessão quanto para instruções sem sessão.0: instruções preparadas não expiram automaticamente.-1(padrão): se a instrução for criada em uma sessão, seu tempo de vida seguirá o timeout dessa sessão e será renovado a cada solicitação nessa sessão. Se a instrução for criada sem uma sessão, ela não expirará automaticamente.
arrowflight.max_prepared_statements_per_user.
ClosePreparedStatement
ClosePreparedStatement quando o identificador está vazio:
- Se
x-clickhouse-session-idestiver presente, fecha todas as instruções preparadas do usuário autenticado nessa sessão. - Se não houver ID de sessão, fecha apenas as instruções preparadas sem sessão do usuário autenticado.
x-clickhouse-session-id), ela também será fechada automaticamente quando essa sessão for encerrada.
Comandos do Flight SQL
CMD contém uma mensagem Flight SQL protobuf serializada, ClickHouse processa os seguintes comandos:
Suportado via GetFlightInfo / GetSchema
| Comando | Descrição |
|---|---|
CommandStatementQuery | Executa uma consulta SQL arbitrária. transaction_id não é suportado. |
CommandGetSqlInfo | Recupera metadados do servidor (nome, versão, versão do Arrow e recursos). |
CommandGetCatalogs | Lista catálogos. Retorna um resultado vazio (o ClickHouse não usa catálogos). |
CommandGetDbSchemas | Lista bancos de dados. Aceita db_schema_filter_pattern opcional (padrão SQL LIKE). |
CommandGetTables | Lista tabelas. Aceita filtros para schema, nome da tabela, tipos de tabela e inclusão opcional do schema. |
CommandGetTableTypes | Lista os tipos de motores de tabela (de system.table_engines). |
CommandGetPrimaryKeys | Recupera as colunas da chave primária de uma tabela especificada. |
CommandPreparedStatementQuery | Executa, por identificador, uma instrução preparada no estilo SELECT. |
Suportado via DoPut
| Command | Descrição |
|---|---|
CommandStatementUpdate | Executa uma instrução DDL/DML (CREATE, INSERT, ALTER etc.). Retorna a contagem de linhas afetadas. transaction_id não é suportado. |
CommandStatementIngest | Faz a inserção em massa de dados Arrow em uma tabela existente. Apenas o modo append é suportado. transaction_id não é suportado. |
CommandPreparedStatementQuery | Associa valores de parâmetros a uma instrução preparada quando enviada via DoPut e, em seguida, retorna DoPutPreparedStatementResult com o identificador da instrução. Apenas um conjunto de parâmetros (uma linha) é aceito, e o número de valores associados deve corresponder exatamente ao número de placeholders ?. |
CommandPreparedStatementUpdate | Executa uma instrução DDL/DML preparada por identificador e retorna a contagem de linhas afetadas. |
Sem suporte no ClickHouse
| Comando | Motivo |
|---|---|
CommandGetCrossReference | O ClickHouse não é um banco de dados relacional e não implementa restrições de chave estrangeira, portanto os metadados de referência cruzada não estão disponíveis. |
CommandGetExportedKeys | O ClickHouse não é um banco de dados relacional e não implementa restrições de chave estrangeira, portanto os metadados de chaves exportadas não estão disponíveis. |
CommandGetImportedKeys | O ClickHouse não é um banco de dados relacional e não implementa restrições de chave estrangeira, portanto os metadados de chaves importadas não estão disponíveis. |
CommandStatementSubstraitPlan | O ClickHouse não oferece suporte a planos Substrait. |
Exemplo completo
Query
Response
Formato de dados
Arrow é compatível — especificar outros formatos do ClickHouse (por exemplo, FORMAT JSON, FORMAT CSV) resulta em erro.
Os tipos de dados do ClickHouse são mapeados para os tipos do Arrow durante a serialização. A configuração output_format_arrow_unsupported_types_as_binary controla se tipos do ClickHouse sem suporte são serializados como blobs binários.
Compatibilidade
- Python (
pyarrow) - Java (
org.apache.arrow.flight) - C++ (
arrow::flight) - Go (
apache/arrow/go) - drivers ADBC (Arrow Database Connectivity)
- DBeaver e outras ferramentas com suporte a Flight SQL