Skip to main content
Este conector aprovecha optimizaciones específicas de ClickHouse, como la partición avanzada y el pushdown de predicados, para mejorar el rendimiento de las consultas y el manejo de los datos. El conector se basa en el conector JDBC oficial de ClickHouse y gestiona su propio catálogo. Antes de Spark 3.0, Spark no tenía un concepto de catálogo integrado, por lo que los usuarios solían recurrir a sistemas de catálogo externos, como Hive Metastore o AWS Glue. Con estas soluciones externas, los usuarios tenían que registrar manualmente las tablas de sus fuentes de datos antes de poder acceder a ellas desde Spark. Sin embargo, desde la introducción del concepto de catálogo en Spark 3.0, Spark ahora puede detectar tablas automáticamente al registrar plugins de catálogo. El catálogo predeterminado de Spark es spark_catalog, y las tablas se identifican como {catalog name}.{database}.{table}. Con la nueva función de catálogo, ahora es posible añadir y trabajar con varios catálogos en una sola aplicación de Spark.

Elegir entre API de catálogo y TableProvider API

El ClickHouse Spark connector admite dos formas de acceso: la API de catálogo y la TableProvider API (acceso basado en formatos). Comprender las diferencias te ayudará a elegir el enfoque adecuado para tu caso de uso.

API de catálogo vs TableProvider API

Requisitos

  • Java 8 o 17 (se requiere Java 17+ para Spark 4.0)
  • Scala 2.12 o 2.13 (Spark 4.0 solo es compatible con Scala 2.13)
  • Apache Spark 3.3, 3.4, 3.5 o 4.0

Matriz de compatibilidad

Instalación y configuración

Para integrar ClickHouse con Spark, hay varias opciones de instalación que se adaptan a distintas configuraciones de proyecto. Puede añadir el ClickHouse Spark connector como dependencia directamente en el archivo de compilación de su proyecto (por ejemplo, en pom.xml para Maven o build.sbt para SBT). Como alternativa, puede colocar los archivos JAR necesarios en la carpeta $SPARK_HOME/jars/ o pasarlos directamente como una opción de Spark mediante la marca --jars en el comando spark-submit. Ambos enfoques garantizan que el conector de ClickHouse esté disponible en su entorno de Spark.

Importar como dependencia

Agregue el siguiente repositorio si desea usar la versión SNAPSHOT.

Descargar la biblioteca

El patrón de nombres del archivo JAR binario es:
Puedes encontrar todos los archivos JAR publicados disponibles en el repositorio central de Maven y todos los archivos JAR SNAPSHOT de compilación diaria en el repositorio de snapshots OSS de Sonatype.
Es fundamental incluir el JAR de clickhouse-jdbc con el clasificador “all”, ya que el conector depende de clickhouse-http y clickhouse-client, que vienen incluidos en clickhouse-jdbc:all. Como alternativa, puedes añadir el JAR de clickhouse-client y clickhouse-http por separado si prefieres no usar el paquete JDBC completo.En cualquier caso, asegúrate de que las versiones de los paquetes sean compatibles según la Matriz de compatibilidad.

Registrar el catálogo (obligatorio)

Para acceder a sus tablas de ClickHouse, debe configurar un nuevo catálogo de Spark con la siguiente configuración: Esta configuración se puede establecer de una de las siguientes maneras:
  • Edite o cree spark-defaults.conf.
  • Pase la configuración a su comando spark-submit (o a sus comandos spark-shell/spark-sql de la CLI).
  • Agregue la configuración al iniciar su contexto.
Al trabajar con un clúster de ClickHouse, debe establecer un nombre de catálogo único para cada instancia. Por ejemplo:
De este modo, podrá acceder desde Spark SQL a la tabla <ck_db>.<ck_table> de clickhouse1 como clickhouse1.<ck_db>.<ck_table>, y a la tabla <ck_db>.<ck_table> de clickhouse2 como clickhouse2.<ck_db>.<ck_table>.

Uso de la TableProvider API (acceso basado en formatos)

Además del enfoque basado en catálogos, el ClickHouse Spark connector admite un patrón de acceso basado en formatos a través de la TableProvider API.

Ejemplo de lectura basada en formato

Ejemplo de escritura basada en el formato

Funciones de TableProvider

La API de TableProvider ofrece varias funciones avanzadas:

Creación automática de tablas

Al escribir en una tabla inexistente, el conector la crea automáticamente con un esquema adecuado. El conector aplica valores predeterminados inteligentes:
  • Engine: Usa MergeTree() de forma predeterminada si no se especifica. Puede indicar un motor distinto mediante la opción motor (p. ej., ReplacingMergeTree(), SummingMergeTree(), etc.)
  • ORDER BY: Obligatorio: debe especificar explícitamente la opción order_by al crear una tabla nueva. El conector valida que todas las columnas indicadas existan en el esquema.
  • Compatibilidad con claves Nullable: Agrega automáticamente settings.allow_nullable_key=1 si ORDER BY contiene columnas Nullable
ORDER BY obligatorio: la opción order_by es obligatoria al crear una tabla nueva mediante la TableProvider API. Debe especificar explícitamente qué columnas usar para la cláusula ORDER BY. El conector valida que todas las columnas indicadas existan en el esquema y generará un error si falta alguna.Selección del motor: el motor predeterminado es MergeTree(), pero puede especificar cualquier table motor de ClickHouse mediante la opción motor (p. ej., ReplacingMergeTree(), SummingMergeTree(), AggregatingMergeTree(), etc.).

Opciones de conexión de TableProvider

Al usar la API basada en formatos, las siguientes opciones de conexión están disponibles:

Opciones de conexión

Opciones de creación de tablas

Estas opciones se usan cuando la tabla no existe y es necesario crearla:
  • La opción order_by es obligatoria al crear una tabla nueva. Todas las columnas especificadas deben existir en el esquema. ** Se establece automáticamente en 1 si ORDER BY contiene columnas anulables y no se proporciona explícitamente.
Práctica recomendada: En ClickHouse Cloud, establece explícitamente settings.allow_nullable_key=1 si las columnas de ORDER BY podrían ser anulables, ya que ClickHouse Cloud requiere esta configuración.

Modos de escritura

El conector de Spark (tanto TableProvider API como API de catálogo) admite los siguientes modos de escritura de Spark:
  • append: Añade datos a una tabla existente
  • overwrite: Reemplaza todos los datos de la tabla (trunca la tabla)
La sobrescritura de particiones no es compatible: Actualmente, el conector de Spark no admite operaciones de sobrescritura a nivel de partición (por ejemplo, el modo overwrite con partitionBy). Esta funcionalidad está en desarrollo. Consulta el issue n.º 34 de GitHub para seguir su progreso.

Configuración de las opciones de ClickHouse

Tanto la API de catálogo como la TableProvider API permiten configurar opciones específicas de ClickHouse (no opciones del conector). Estas se transfieren a ClickHouse al crear tablas o ejecutar consultas. Las opciones de ClickHouse permiten configurar ajustes específicos de ClickHouse, como allow_nullable_key, index_granularity y otros ajustes a nivel de tabla o de consulta. Estas son distintas de las opciones del conector (como host, database, table), que controlan cómo el conector se conecta a ClickHouse.

Uso de la TableProvider API

Con la TableProvider API, use el formato de opción settings.<key>:
Con la API de catálogo, utilice el formato spark.sql.catalog.<catalog_name>.option.<key> en la configuración de Spark:
O configúralos al crear las tablas con Spark SQL:

Configuración de ClickHouse Cloud

Al conectarse a ClickHouse Cloud, asegúrese de habilitar SSL y configurar el modo SSL adecuado. Por ejemplo:

Leer datos

Escribir datos

La sobrescritura de particiones no es compatible: La Catalog API no admite actualmente operaciones de sobrescritura a nivel de partición (por ejemplo, el modo overwrite con partitionBy). Esta función está en desarrollo. Consulta el issue n.º 34 en GitHub para hacer seguimiento de esta función.

Operaciones DDL

Puede realizar operaciones DDL en su instancia de ClickHouse con Spark SQL, y todos los cambios se conservan de inmediato en ClickHouse. Spark SQL le permite escribir consultas exactamente como lo haría en ClickHouse, por lo que puede ejecutar directamente comandos como CREATE TABLE, TRUNCATE y más, sin modificarlos, por ejemplo:
Al usar Spark SQL, solo se puede ejecutar una instrucción a la vez.
Los ejemplos anteriores muestran consultas de Spark SQL que puedes ejecutar dentro de tu aplicación con cualquier API: Java, Scala, PySpark o shell.

Trabajar con VariantType

La compatibilidad con VariantType está disponible en Spark 4.0+ y requiere ClickHouse 25.3+ con los tipos experimentales JSON/Variant habilitados.
El conector admite VariantType de Spark para trabajar con datos semiestructurados. VariantType se asigna a los tipos JSON y Variant de ClickHouse, lo que permite almacenar y consultar de forma eficiente datos con esquemas flexibles.
Esta sección se centra específicamente en el mapeo y uso de VariantType. Para obtener una descripción general completa de todos los tipos de datos compatibles, consulte la sección Tipos de datos compatibles.

Mapeo de tipos de ClickHouse

Lectura de datos de VariantType

Al leer datos de ClickHouse, las columnas JSON y Variant se asignan automáticamente a VariantType de Spark:

Escribir datos de VariantType

Puede escribir datos de VariantType en ClickHouse usando tipos de columna JSON o Variant:

Creación de tablas VariantType con Spark SQL

Puede crear tablas VariantType mediante DDL de Spark SQL:

Configuración de los tipos Variant

Al crear tablas con columnas VariantType, puede especificar qué tipos de ClickHouse usar:

Tipo JSON (predeterminado)

Si no se especifica la propiedad variant_types, la columna utiliza de forma predeterminada el tipo JSON de ClickHouse, que solo acepta objetos JSON:
Esto crea la siguiente consulta de ClickHouse:

Tipo Variant con varios tipos

Para admitir tipos primitivos, arrays y objetos JSON, especifique los tipos en la propiedad variant_types:
Esto crea la siguiente consulta de ClickHouse:

Tipos compatibles con el tipo Variant

Los siguientes tipos de ClickHouse pueden usarse en Variant():
  • Primitivos: String, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64, Bool
  • Arrays: Array(T), donde T es cualquier tipo compatible, incluidos los arrays anidados
  • JSON: JSON para almacenar objetos JSON

Configuración del formato de lectura

De forma predeterminada, las columnas JSON y Variant se leen como VariantType. Puedes anular este comportamiento para leerlas como cadenas:

Compatibilidad con formatos de escritura

La compatibilidad de escritura de VariantType varía según el formato: Configure el formato de escritura:
Si necesita escribir en un tipo Variant de ClickHouse, use el formato JSON. El formato Arrow solo permite escribir en el tipo JSON.

Prácticas recomendadas

  1. Use JSON type for JSON-only data: Si solo almacena objetos JSON, use el tipo JSON predeterminado (sin la propiedad variant_types)
  2. Specify types explicitly: Al usar Variant(), enumere explícitamente todos los tipos que piensa almacenar
  3. Enable experimental features: Asegúrese de que ClickHouse tenga habilitado allow_experimental_json_type = 1
  4. Use JSON format for writes: Se recomienda usar el formato JSON para escribir datos de VariantType, ya que ofrece una mejor compatibilidad
  5. Consider query patterns: Los tipos JSON/Variant admiten consultas de rutas JSON de ClickHouse para un filtrado eficiente
  6. Column hints for performance: Al usar campos JSON en ClickHouse, agregar sugerencias de columna mejora el rendimiento de las consultas. Actualmente, no es compatible agregar sugerencias de columna mediante Spark. Consulte el GitHub issue #497 para seguir el estado de esta funcionalidad.

Ejemplo: Flujo de trabajo completo

Configuraciones

Estas son las configuraciones ajustables disponibles en el conector.
Uso de las configuraciones: Estas son opciones de configuración a nivel de Spark que se aplican tanto a Catalog API como a TableProvider API. Se pueden configurar de dos maneras:
  1. Configuración global de Spark (se aplica a todas las operaciones):
  2. Sobrescritura por operación (solo en TableProvider API; puede sobrescribir la configuración global):
Como alternativa, puede configurarlas en spark-defaults.conf o al crear la sesión de Spark.

Tipos de datos compatibles

Esta sección describe la correspondencia entre los tipos de datos de Spark y ClickHouse. Las tablas siguientes ofrecen una referencia rápida para convertir tipos de datos al leer desde ClickHouse en Spark y al insertar datos de Spark en ClickHouse.

Lectura de datos de ClickHouse en Spark

Inserción de datos desde Spark en ClickHouse

Contribuciones y soporte

Si quieres contribuir al proyecto o informar de algún problema, ¡agradecemos tus aportaciones! Visita nuestro repositorio de GitHub para abrir una incidencia, proponer mejoras o enviar un pull request. ¡Las contribuciones son bienvenidas! Consulta las directrices de contribución del repositorio antes de empezar. ¡Gracias por ayudarnos a mejorar nuestro ClickHouse Spark connector!
Última modificación el 3 de julio de 2026