QueryContexts
QueryContext. El QueryContext contiene las estructuras clave que se utilizan para crear consultas en la base de datos ClickHouse, así como la configuración usada para procesar el resultado en un QueryResult u otra estructura de datos de respuesta. Esto incluye la propia consulta, parámetros, ajustes, formatos de lectura y otras propiedades.
Se puede obtener un QueryContext mediante el método create_query_context del Client. Este método acepta los mismos parámetros que el método principal de consulta. Después, este contexto de consulta puede pasarse a los métodos query, query_df o query_np como argumento con nombre context, en lugar de cualquiera o de todos los demás argumentos de esos métodos. Tenga en cuenta que los argumentos adicionales especificados en la llamada al método sobrescribirán cualquier propiedad de QueryContext.
El caso de uso más claro de un QueryContext es enviar la misma consulta con distintos valores de parámetros enlazados. Todos los valores de los parámetros pueden actualizarse llamando al método QueryContext.set_parameters con un diccionario, o bien se puede actualizar un valor individual llamando a QueryContext.set_parameter con el par key, value deseado.
QueryContexts no son seguros para su uso en varios hilos, pero se puede obtener una copia en un entorno multihilo llamando al método QueryContext.updated_copy.
Consultas en streaming
query_column_block_stream— Devuelve los datos de la consulta en bloques, como una secuencia de columnas, utilizando objetos nativos de Pythonquery_row_block_stream— Devuelve los datos de la consulta como un bloque de filas utilizando objetos nativos de Pythonquery_rows_stream— Devuelve los datos de la consulta como una secuencia de filas utilizando objetos nativos de Pythonquery_np_stream— Devuelve cada bloque de datos de la consulta de ClickHouse como un array de NumPyquery_df_stream— Devuelve cada bloque de datos de la consulta de ClickHouse como un DataFrame de Pandasquery_arrow_stream— Devuelve los datos de la consulta como objetosRecordBatchde PyArrowquery_df_arrow_stream— Devuelve cada lote de Arrow como un DataFrame de Pandas o de Polars, seleccionado pordataframe_library
StreamContext que debe abrirse con una sentencia with. Los métodos de streaming del Client async deben esperarse y abrirse con async with.
Bloques de datos
query principal como un flujo de bloques recibidos del servidor ClickHouse. Estos bloques se transmiten hacia y desde ClickHouse en el formato personalizado “Native”. Un “bloque” es simplemente una secuencia de columnas de datos binarios, en la que cada columna contiene la misma cantidad de valores de datos del tipo de dato especificado. (Como base de datos columnar, ClickHouse almacena estos datos de forma similar). El tamaño de un bloque devuelto por una consulta depende de dos configuraciones de usuario que pueden establecerse en varios niveles (perfil de usuario, usuario, sesión o consulta). Son:
- max_block_size — Tamaño máximo del bloque en filas.
- preferred_block_size_bytes — Tamaño preferido del bloque en bytes.
preferred_block_size_bytes, un bloque no superará max_block_size filas. El tamaño real puede ser menor y no debe considerarse estable.
Al usar uno de los métodos query_*_stream del cliente, los resultados se devuelven bloque por bloque. ClickHouse Connect solo carga un bloque a la vez. Esto permite procesar grandes cantidades de datos sin necesidad de cargar en memoria todo un conjunto de resultados grande. Ten en cuenta que la aplicación debe estar preparada para procesar cualquier cantidad de bloques y que el tamaño exacto de cada bloque no puede controlarse.
Búfer de datos HTTP para procesamiento lento
http_buffer_size cuando la aplicación tenga suficiente memoria para almacenar en búfer más datos de respuesta. El valor predeterminado es de 10 MiB. Los bytes de respuesta de lz4 y zstd permanecen comprimidos en este búfer, lo que aumenta su capacidad efectiva.
StreamContexts
query_*_stream (como query_row_block_stream) devuelve un objeto StreamContext de ClickHouse, que combina un contexto y un generador de Python. Este es el uso básico:
StreamContext sin una sentencia with generará un error. El uso de un contexto de Python garantiza que el stream (en este caso, una respuesta HTTP en streaming) se cierre correctamente aunque no se consuman todos los datos y/o se produzca una excepción durante el procesamiento. Además, los StreamContext solo pueden usarse una vez para consumir el stream. Intentar usar un StreamContext después de haber salido de él producirá un StreamClosedError.
Si la conexión falla mientras se está leyendo un resultado, se genera un StreamFailureError en lugar de devolver silenciosamente un resultado truncado. Su mensaje sigue la configuración show_clickhouse_errors del client.
Puedes usar la propiedad source del StreamContext para acceder al objeto de resultado padre, que incluye los nombres de las columnas y los tipos. Para la mayoría de los streams, este es un QueryResult; los métodos query_np_stream y query_df_stream exponen un NumpyResult en su lugar.
Tipos de flujo
query_column_block_stream devuelve el bloque como una secuencia de datos de columna almacenados como tipos de datos nativos de Python. Si usamos las consultas taxi_trips anteriores, los datos devueltos serán una lista en la que cada elemento es otra lista (o tupla) que contiene todos los datos de la columna correspondiente. Así, block[0] sería una tupla que solo contendría cadenas. Los formatos orientados a columnas se usan sobre todo para realizar operaciones de agregación sobre todos los valores de una columna, como sumar las tarifas totales.
El método query_row_block_stream devuelve el bloque como una secuencia de filas, como en una base de datos relacional tradicional. Para los trayectos de taxi, los datos devueltos serán una lista en la que cada elemento es otra lista que representa una fila de datos. Así, block[0] contendría todos los campos (en orden) del primer trayecto de taxi, block[1] contendría una fila con todos los campos del segundo trayecto de taxi, y así sucesivamente. Los resultados orientados a filas normalmente se usan en procesos de visualización o transformación.
El método query_rows_stream pasa automáticamente al siguiente bloque y devuelve una fila cada vez. Es la contraparte fila por fila de query_row_block_stream.
El método query_np_stream devuelve cada bloque como un array de NumPy. Cuando todas las columnas del resultado comparten un dtype de NumPy, el array es bidimensional con forma (filas, columnas). Los resultados mixtos se devuelven como un array estructurado unidimensional o usan el dtype object.
El método query_df_stream devuelve cada bloque de ClickHouse como un DataFrame de Pandas bidimensional. Aquí tienes un ejemplo que muestra que el objeto StreamContext puede usarse como contexto de forma diferida (pero solo una vez).
query_df_arrow_stream convierte lotes de Arrow en DataFrames de Pandas o Polars. Selecciona la biblioteca con dataframe_library, cuyo valor predeterminado es "pandas".
Por último, query_arrow_stream encapsula una respuesta ArrowStream de ClickHouse en un StreamContext. Cada iteración devuelve un RecordBatch de PyArrow.
Ejemplos de streaming
Transmitir filas en streaming
Transmitir bloques de filas
Transmitir DataFrames de Pandas
Transmitir lotes de Arrow
Filas en streaming asíncrono
Consultas con NumPy, Pandas y Arrow
Consultas con NumPy
query_np devuelve los resultados de la consulta como un array de NumPy en lugar de un QueryResult de ClickHouse Connect.
Consultas con Pandas
query_df devuelve los resultados de la consulta como un DataFrame de Pandas en lugar de un QueryResult de ClickHouse Connect.
Consultas con PyArrow
query_arrow devuelve una tabla de PyArrow utilizando directamente el formato de salida Arrow de ClickHouse. Acepta query, parameters, settings, external_data y transport_settings. La opción use_strings controla si las columnas String de ClickHouse se emiten como cadenas de Arrow o como valores binarios.
DataFrames basados en Arrow
query_df_arrow y query_df_arrow_stream. Estos métodos evitan la conversión mediante objetos fila de Python y reutilizan los búferes de Arrow cuando la biblioteca de destino lo permite:
query_df_arrow: Ejecuta la consulta con el formato de salidaArrowde ClickHouse y devuelve un DataFrame.dataframe_library="pandas"devuelve un DataFrame de Pandas 2.0 o posterior usandopd.ArrowDtype.dataframe_library="polars"devuelve un DataFrame de Polars creado conpl.from_arrow.
query_df_arrow_stream: Transmite lotes de Arrow como DataFrames de Pandas o Polars.
Consulta a un DataFrame basado en Arrow
Notas y advertencias
- ClickHouse controla el esquema de Arrow. Los tipos sin una representación directa en Arrow pueden devolverse usando un tipo físico compatible, incluidos los campos binarios. Inspeccione
table.schemao los dtypes del DataFrame antes de aplicar conversiones específicas de la aplicación. - Los resultados de Pandas basados en Arrow requieren Pandas 2.0 o posterior.
use_stringscontrola si las columnasStringde ClickHouse usan campos de cadena o binarios de Arrow cuando el servidor admiteoutput_format_arrow_string_as_string.tz_mode="schema"todavía no es compatible con los métodos de consulta basados en Arrow. Emiten una advertencia y conservan los metadatos de zona horaria proporcionados por la respuesta de Arrow.
Formatos de lectura
query, query_np y query_df. No se aplican a los métodos raw ni Arrow porque esos métodos usan directamente un formato de salida del servidor. Por ejemplo, establecer el formato de lectura de UUID en "string" devuelve cadenas UUID en lugar de objetos uuid.UUID.
El argumento “data type” de cualquier función de formatting puede incluir wildcards. El format es una única cadena en minúsculas. Los envoltorios de contenedor, como Array, Nullable y LowCardinality, conservan el formato seleccionado para su element type.
Los formatos de lectura pueden establecerse en varios niveles:
- Globalmente, usando los métodos definidos en el package
clickhouse_connect.datatypes.format. Esto controlará el formato del tipo de dato configurado para todas las consultas.
- Para una consulta completa, con el argumento de diccionario opcional
query_formats. En ese caso, cualquier columna (o subcolumna) de los tipos de dato especificados usará el formato configurado.
- Para una columna de resultado específica, use el diccionario opcional
column_formats. Cada clave es el nombre de una columna devuelta. Su valor es una cadena de formato o una correspondencia anidada entre nombres de tipos de ClickHouse y formatos, lo que resulta útil para Tuples, Maps y otros tipos contenedores.
Opciones de formato de lectura (tipos de Python)
Datos externos
clickhouse_connect.driver.external.ExternalData mediante el parámetro external_data.
Este ejemplo realiza un join de un archivo CSV externo con una tabla
directors almacenada en el server:
ExternalData inicial mediante el método add_file, que acepta los mismos parámetros que el constructor. En HTTP, todos los datos externos se transmiten como parte de una carga de archivos multi-part/form-data.
El backend de chDB no admite datos externos.
Zonas horarias
DateTime y DateTime64 de ClickHouse se transmiten como valores numéricos basados en la época Unix. ClickHouse Connect los convierte en objetos datetime de Python usando los metadatos de la columna, las sobrescrituras de la consulta y la política de zona horaria del Client.
El Client tiene dos opciones de zona horaria independientes:
tz_sourceselecciona la zona horaria de respaldo para las columnas sin metadatos explícitos de zona horaria:"auto"es la opción predeterminada. Usa la zona horaria del servidor cuando el Client puede resolverla de forma segura a través de los cambios de horario de verano; de lo contrario, usa la zona horaria local."server"siempre usa la zona horaria del servidor."local"siempre usa la zona horaria local del proceso.
tz_modecontrola la gestión de la zona horaria:"naive_utc"es la opción predeterminada. Los resultados en UTC y equivalentes a UTC se devuelven como objetosdatetimesin zona horaria, por compatibilidad con versiones anteriores."aware"conserva latzinfode UTC y devuelve valores UTC con zona horaria."schema"devuelve valores con zona horaria solo cuando el tipo de la columna declara una zona horaria, y valores sin zona horaria para columnasDateTime/DateTime64sin especificar.
"naive_utc" y "aware", la zona horaria activa se selecciona en este orden:
- Una sobrescritura
column_tzspor columna. - Metadatos de zona horaria en el tipo de columna de ClickHouse.
- La sobrescritura
query_tzpara toda la consulta. - La información de zona horaria devuelta con la respuesta HTTP.
- La zona horaria de respaldo seleccionada por
tz_source.
tz_mode="schema" ignora las zonas horarias de la consulta y de respaldo, pero una sobrescritura explícita de column_tzs sigue teniendo prioridad.
zoneinfo de la biblioteca. En Windows, tzdata se instala automáticamente. En las imágenes mínimas de Linux sin una base de datos de zonas horarias de IANA, instala clickhouse-connect[tzdata].
Los resultados de Pandas conservan la resolución natural de cada tipo de ClickHouse, como datetime64[s] para DateTime y datetime64[ms] para DateTime64(3). Los métodos de DataFrame basados en Arrow query_df_arrow y query_df_arrow_stream todavía no implementan tz_mode="schema" y mostrarán una advertencia cuando se solicite. query_arrow y query_arrow_stream devuelven los metadatos de zona horaria de la respuesta Arrow sin cambios.