FORMAT Native gerenciado pelo cliente, que abrange query, query_np, query_df, suas variantes de streaming por block e por linha, e as inserções, incluindo insert_df. Os métodos Arrow usam FORMAT Arrow e não são afetados, assim como as consultas raw, as inserções raw e os formatos não Native.
O codec é experimental e de uso opcional. O codec Python continua sendo o padrão.
Instalação
O codec compilado é distribuído como um wheel separado chamadoclickhouse-connect-core, que fornece o módulo de extensão _ch_core. Para avaliação, instale o codec e o PyArrow juntos:
query_np, query_df, suas variantes de streaming e query(..., use_numpy=True). Sem o PyArrow, native_codec="rust" registra um aviso e executa essas consultas com o codec Python. Já native_codec="rust_strict" gera NotSupportedError.
O extra rust sozinho permanece enxuto para aplicações que usam resultados padrão de linhas do Python, streams de blocos de linhas ou colunas e inserção sem solicitar saída NumPy ou Pandas. Esses caminhos não exigem PyArrow:
NotSupportedError indicando este comando de instalação.
Habilitando o codec
Selecione o codec com a opção de clientenative_codec:
O padrão também pode ser definido pela configuração comum
native_codec ou pela variável de ambiente CLICKHOUSE_CONNECT_NATIVE_CODEC. A precedência é: primeiro o keyword argument do cliente, depois a configuração comum e, por fim, a variável de ambiente.
A opção é ignorada para clientes com interface="chdb", que sempre usam o codec Python.
Quando usar o codec Rust
O codec Rust é mais útil para resultados grandes de DataFrame com tipos de texto, contêineres e tipos complexos comoString, LowCardinality, Map, Array, JSON, Decimal e UUID. Ele também pode ajudar em streams de blocos grandes de linhas e colunas, cargas de trabalho com consultas concorrentes e inserções em massa.
Resultados pequenos e consultas limitadas pela rede podem apresentar pouca diferença. Resultados numéricos simples já utilizam caminhos em massa eficientes no codec Python, portanto também tendem a se beneficiar menos.
Chamadas query() com buffer sobre resultados muito largos ou totalmente numéricos podem, atualmente, ser mais lentas e consumir mais memória de pico com o codec Rust. Para essas cargas de trabalho, prefira query_df, query_row_block_stream ou query_column_block_stream. O streaming mantém o uso de memória limitado.
Faça um benchmark da sua própria carga de trabalho antes de adotar o codec. Use native_codec="rust_strict" durante as medições para que uma opção sem suporte ou uma dependência ausente gere um erro, em vez de encaminhar silenciosamente a consulta para o Python.
Regras de fallback
As decisões de fallback são tomadas antes que qualquer byte seja lido ou enviado, portanto nunca ocorre troca de codec no meio do stream. Para queries, a escolha acontece antes de o response body ser consumido. Para inserções, o codificador Rust só é selecionado quando todos os tipos de coluna têm suporte; caso contrário, a inserção inteira é executada no codec Python. Quandonaive_datetime_insert="server" está ativo, o rust encaminha ao codec Python qualquer inserção que contenha uma coluna DateTime ou DateTime64, de modo que a timezone declarada da coluna ou a server timezone seja aplicada. Já o rust_strict rejeita essa combinação. O modo padrão naive_datetime_insert="local" continua usando o codificador Rust.
Queries de metadados internas do driver, incluindo as instruções de reflexão do dialect do SQLAlchemy, sempre usam o codec Python, de forma silenciosa, em todos os modos.
Payloads Native malformados detectados pelo codec Rust geram DataError.
Versioning
Oclickhouse-connect-core é versionado de forma independente do clickhouse-connect. O driver declara um intervalo de compatibilidade por meio do extra rust, e o módulo exporta uma versão da API de binding que o driver verifica quando um codec Rust é selecionado. Se a wheel instalada for muito antiga para o driver, a criação do cliente gera um NotSupportedError indicando o comando de upgrade:
clickhouse-connect-core e podem ser obtidas com um upgrade para uma wheel do core compatível. Alterações na integração Rust do driver exigem um upgrade do clickhouse-connect.
Diferenças de comportamento conhecidas
O codec Rust busca paridade célula a célula com o codec Python. As seguintes diferenças são conhecidas.- Os resultados de
query_npequery_dfpara colunasVariantcontêm objetos Python simples em vez de valores escalares do numpy. Os valores são iguais, mas os tipos das células diferem. - Valores
Dynamicque contêmTime64são materializados comodatetime.timedeltanos resultados dequery_npequery_dfdo Rust. Nas escalas 0, 3, 6 e 9, os valores são iguais às célulasnumpy.timedelta64do codec Python, mas os tipos das células diferem. Nas demais escalas, o codec Rust retornadatetime.timedelta, enquanto o codec Python geraProgrammingError, pois o NumPy não possui uma unidade correspondente. Os metadados dos membros deDynamicnão são expostos ao driver após a decodificação em Rust; portanto, usenative_codec="python"quando forem necessários os tipos de célula do NumPy ou a validação de escalas sem suporte. - Em
query_df, o codec Python pode converter em string valores compostos armazenados em shared data de JSON. O codec Rust retorna objetos decodificados, o que corresponde aos resultados dequery_npde ambos os codecs. - Uma alternativa
LowCardinalitydentro de um contêiner que se materializa por célula, comoArray(Variant(...)), produz células com valores iguais que não compartilham a identidade de objeto por slot de dicionário apresentada pelo codec Python. - Colunas
Nullable(Tuple(...))com um ou mais elementos são decodificadas corretamente no codec Rust. O codec Python interpreta esse layout de forma incorreta, e o resultado do Rust é o comportamento de referência. Ambos os codecs suportamNullable(Tuple()). rust_strictrejeita opções de consulta que o caminho Rust não implementa, comoquery_formatscustomizados por consulta, em vez de alterar o comportamento silenciosamente.- Erros de conversão e de validação de insert no Rust podem gerar
DataErroronde o codec Python geraValueError, e o texto da mensagem pode diferir. Entre os exemplos estão valoresTimeeTime64inválidos, endereços IPv6, dimensões de QBit, comprimentos deFixedString, stringsFloat64e tentativas de inserir elementos em uma colunaTuple(). - O codificador Rust rejeita
b""paraFixedString(N)e strings numéricas como"2"em colunas de inteiros. O codec Python preenche com zeros um valorFixedStringvazio e converte strings numéricas. - O codec Rust decodifica alguns valores de variante compartilhada de
Dynamicpara seus tipos Python nos casos em que o codec Python mantém o valor como raw bytes. Por exemplo, umDatearmazenado pode ser retornado comodatetime.dateno Rust e como um valor binário no Python.