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
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
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
- Maven
- Gradle
- SBT
- Spark SQL/Shell CLI
Descargar la biblioteca
Registrar el catálogo (obligatorio)
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 comandosspark-shell/spark-sqlde la CLI). - Agregue la configuración al iniciar su contexto.
Uso de la TableProvider API (acceso basado en formatos)
Ejemplo de lectura basada en formato
- Python
- Scala
- Java
Ejemplo de escritura basada en el formato
- Python
- Scala
- Java
Funciones de TableProvider
Creación automática de tablas
- Engine: Usa
MergeTree()de forma predeterminada si no se especifica. Puede indicar un motor distinto mediante la opciónmotor(p. ej.,ReplacingMergeTree(),SummingMergeTree(), etc.) - ORDER BY: Obligatorio: debe especificar explícitamente la opción
order_byal 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=1si ORDER BY contiene columnas Nullable
- Python
- Scala
- Java
Opciones de conexión de TableProvider
Opciones de conexión
Opciones de creación de tablas
- La opción
order_byes obligatoria al crear una tabla nueva. Todas las columnas especificadas deben existir en el esquema. ** Se establece automáticamente en1si ORDER BY contiene columnas anulables y no se proporciona explícitamente.
Modos de escritura
TableProvider API como API de catálogo) admite los siguientes modos de escritura de Spark:
append: Añade datos a una tabla existenteoverwrite: Reemplaza todos los datos de la tabla (trunca la tabla)
- Python
- Scala
- Java
Configuración de las opciones de ClickHouse
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
settings.<key>:
- Python
- Scala
- Java
Uso de la API de catálogo
spark.sql.catalog.<catalog_name>.option.<key> en la configuración de Spark:
Configuración de ClickHouse Cloud
Leer datos
- Java
- Scala
- Python
- Spark SQL
Escribir datos
- Java
- Scala
- Python
- Spark SQL
Operaciones DDL
Al usar Spark SQL, solo se puede ejecutar una instrucción a la vez.
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.
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
JSON y Variant se asignan automáticamente a VariantType de Spark:
- Scala
- Python
- Java
Escribir datos de VariantType
- Scala
- Python
- Java
Creación de tablas VariantType con Spark SQL
Configuración de los tipos Variant
Tipo JSON (predeterminado)
variant_types, la columna utiliza de forma predeterminada el tipo JSON de ClickHouse, que solo acepta objetos JSON:
Tipo Variant con varios tipos
variant_types:
Tipos compatibles con el tipo Variant
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:
JSONpara almacenar objetos JSON
Configuración del formato de lectura
VariantType. Puedes anular este comportamiento para leerlas como cadenas:
- Scala
- Python
- Java
Compatibilidad con formatos de escritura
Configure el formato de escritura:
Prácticas recomendadas
- Use JSON type for JSON-only data: Si solo almacena objetos JSON, use el tipo JSON predeterminado (sin la propiedad
variant_types) - Specify types explicitly: Al usar
Variant(), enumere explícitamente todos los tipos que piensa almacenar - Enable experimental features: Asegúrese de que ClickHouse tenga habilitado
allow_experimental_json_type = 1 - Use JSON format for writes: Se recomienda usar el formato JSON para escribir datos de VariantType, ya que ofrece una mejor compatibilidad
- Consider query patterns: Los tipos JSON/Variant admiten consultas de rutas JSON de ClickHouse para un filtrado eficiente
- 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
- Scala
- Python
- Java
Configuraciones
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:
-
Configuración global de Spark (se aplica a todas las operaciones):
-
Sobrescritura por operación (solo en TableProvider API; puede sobrescribir la configuración global):
spark-defaults.conf o al crear la sesión de Spark.