> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-home-button.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Integra ClickHouse con Databricks

# Integrar ClickHouse con Databricks

export const ClickHouseSupportedBadge = () => {
  return <div className="ClickHouseSupportedBadge">
            <div className="ClickHouseSupportedIcon">
                <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                    <path d="M1.30762 1.39073C1.30762 1.3103 1.37465 1.22986 1.46849 1.22986H2.64824C2.72868 1.22986 2.80912 1.29689 2.80912 1.39073V14.4886C2.80912 14.5691 2.74209 14.6495 2.64824 14.6495H1.46849C1.38805 14.6495 1.30762 14.5825 1.30762 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M4.2832 1.39073C4.2832 1.3103 4.35023 1.22986 4.44408 1.22986H5.62383C5.70427 1.22986 5.7847 1.29689 5.7847 1.39073V14.4886C5.7847 14.5691 5.71767 14.6495 5.62383 14.6495H4.44408C4.36364 14.6495 4.2832 14.5825 4.2832 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M7.25977 1.39073C7.25977 1.3103 7.3268 1.22986 7.42064 1.22986H8.60039C8.68083 1.22986 8.76127 1.29689 8.76127 1.39073V14.4886C8.76127 14.5691 8.69423 14.6495 8.60039 14.6495H7.42064C7.3402 14.6495 7.25977 14.5825 7.25977 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M10.2354 1.39073C10.2354 1.3103 10.3024 1.22986 10.3962 1.22986H11.576C11.6564 1.22986 11.7369 1.29689 11.7369 1.39073V14.4886C11.7369 14.5691 11.6698 14.6495 11.576 14.6495H10.3962C10.3158 14.6495 10.2354 14.5825 10.2354 14.4886V1.39073Z" fill="currentColor" />
                    <path d="M13.2256 6.6057C13.2256 6.52526 13.2926 6.44482 13.3865 6.44482H14.5662C14.6466 6.44482 14.7271 6.51186 14.7271 6.6057V9.27354C14.7271 9.35398 14.6601 9.43442 14.5662 9.43442H13.3865C13.306 9.43442 13.2256 9.36739 13.2256 9.27354V6.6057Z" fill="currentColor" />
                </svg>
            </div>
            ClickHouse Supported
        </div>;
};

export const Image = ({img, alt, size}) => {
  return <Frame>
      <img src={img} alt={alt} />
    </Frame>;
};

El conector de ClickHouse para Spark funciona perfectamente con Databricks. Esta guía abarca la configuración, la instalación y los patrones de uso específicos de Databricks.

<div id="api-selection">
  ## Selección de API para Databricks
</div>

De forma predeterminada, Databricks usa Unity Catalog, que bloquea el registro de catálogos de Spark. En este caso, **debe** usar la **TableProvider API** (acceso basado en formato).

Sin embargo, si desactiva Unity Catalog creando un clúster con el modo de acceso **No isolation shared**, puede usar la **Catalog API** en su lugar. La Catalog API proporciona una configuración centralizada e integración nativa con Spark SQL.

| Estado de Unity Catalog                 | API recomendada                       | Notas                                                           |
| --------------------------------------- | ------------------------------------- | --------------------------------------------------------------- |
| **Habilitado** (predeterminado)         | TableProvider API (basada en formato) | Unity Catalog bloquea el registro de catálogos de Spark         |
| **Deshabilitado** (No isolation shared) | Catalog API                           | Requiere un clúster con el modo de acceso "No isolation shared" |

<div id="installation">
  ## Instalación en Databricks
</div>

<div id="installation-ui">
  ### Opción 1: Subir el JAR mediante la UI de Databricks
</div>

1. Compila o [descarga](https://repo1.maven.org/maven2/com/clickhouse/spark/) el JAR de runtime:
   ```bash theme={null}
   clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}-{{ stable_version }}.jar
   ```

2. Sube el JAR a tu espacio de trabajo de Databricks:
   * Ve a **Espacio de trabajo** → navega hasta la carpeta deseada
   * Haz clic en **Upload** → selecciona el archivo JAR
   * El JAR se almacenará en tu espacio de trabajo

3. Instala la biblioteca en tu clúster:
   * Ve a **Compute** → selecciona tu clúster
   * Haz clic en la pestaña **Libraries**
   * Haz clic en **Install New**
   * Selecciona **DBFS** o **Espacio de trabajo** → navega hasta el archivo JAR que subiste
   * Haz clic en **Install**

<Image img={require('@site/images/integrations/data-ingestion/apache-spark/databricks/databricks-libraries-tab.png')} alt="Pestaña Libraries de Databricks" />

<Image img={require('@site/images/integrations/data-ingestion/apache-spark/databricks/databricks-install-from-volume.png')} alt="Instalación de la biblioteca desde el volumen del espacio de trabajo" />

4. Reinicia el clúster para cargar la biblioteca

<div id="installation-cli">
  ### Opción 2: Instalar con la CLI de Databricks
</div>

```bash theme={null}
# Subir JAR a DBFS
databricks fs cp clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}-{{ stable_version }}.jar \
  dbfs:/FileStore/jars/

# Instalar en el clúster
databricks libraries install \
  --cluster-id <your-cluster-id> \
  --jar dbfs:/FileStore/jars/clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}-{{ stable_version }}.jar
```

<div id="installation-maven">
  ### Opción 3: Coordenadas de Maven (recomendada)
</div>

1. Ve a tu espacio de trabajo de Databricks:
   * Ve a **Compute** → Selecciona tu clúster
   * Haz clic en la pestaña **Libraries**
   * Haz clic en **Install New**
   * Selecciona la pestaña **Maven**

2. Agrega las coordenadas de Maven:

```text theme={null}
com.clickhouse.spark:clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }}
```

<Image img={require('@site/images/integrations/data-ingestion/apache-spark/databricks/databricks-maven-tab.png')} alt="Configuración de bibliotecas Maven en Databricks" />

3. Haz clic en **Install** y reinicia el clúster para cargar la biblioteca

<div id="tableprovider-api">
  ## Uso de la TableProvider API
</div>

Cuando Unity Catalog está habilitado (de forma predeterminada), **debe** usar la TableProvider API (acceso basado en formatos), ya que Unity Catalog bloquea el registro del catálogo de Spark. Si ha deshabilitado Unity Catalog usando un clúster con el modo de acceso "No isolation shared", puede usar la [Catalog API](/es/integrations/connectors/data-ingestion/apache-spark/spark-native-connector#register-the-catalog-required) en su lugar.

<div id="reading-data-table-provider">
  ### Lectura de datos
</div>

<Tabs>
  <Tab title="Python">
    ```python theme={null}
    # Leer datos de ClickHouse mediante TableProvider API
    df = spark.read \
        .format("clickhouse") \
        .option("host", "your-clickhouse-cloud-host.clickhouse.cloud") \
        .option("protocol", "https") \
        .option("http_port", "8443") \
        .option("database", "default") \
        .option("table", "events") \
        .option("user", "default") \
        .option("password", dbutils.secrets.get(scope="clickhouse", key="password")) \
        .option("ssl", "true") \
        .load()

    # El esquema se infiere automáticamente
    df.display()
    ```
  </Tab>

  <Tab title="Scala">
    ```scala theme={null}
    val df = spark.read
      .format("clickhouse")
      .option("host", "your-clickhouse-cloud-host.clickhouse.cloud")
      .option("protocol", "https")
      .option("http_port", "8443")
      .option("database", "default")
      .option("table", "events")
      .option("user", "default")
      .option("password", dbutils.secrets.get(scope="clickhouse", key="password"))
      .option("ssl", "true")
      .load()

    df.show()
    ```
  </Tab>
</Tabs>

<div id="writing-data-unity">
  ### Escritura de datos
</div>

<Tabs>
  <Tab title="Python">
    ```python theme={null}
    # Escribir en ClickHouse: la tabla se creará automáticamente si no existe
    df.write \
        .format("clickhouse") \
        .option("host", "your-clickhouse-cloud-host.clickhouse.cloud") \
        .option("protocol", "https") \
        .option("http_port", "8443") \
        .option("database", "default") \
        .option("table", "events_copy") \
        .option("user", "default") \
        .option("password", dbutils.secrets.get(scope="clickhouse", key="password")) \
        .option("ssl", "true") \
        .option("order_by", "id") \  # Obligatorio: especifica ORDER BY al crear una tabla nueva
        .option("settings.allow_nullable_key", "1") \  # Obligatorio en ClickHouse Cloud si ORDER BY incluye columnas que admiten NULL
        .mode("append") \
        .save()
    ```
  </Tab>

  <Tab title="Scala">
    ```scala theme={null}
    df.write
      .format("clickhouse")
      .option("host", "your-clickhouse-cloud-host.clickhouse.cloud")
      .option("protocol", "https")
      .option("http_port", "8443")
      .option("database", "default")
      .option("table", "events_copy")
      .option("user", "default")
      .option("password", dbutils.secrets.get(scope="clickhouse", key="password"))
      .option("ssl", "true")
      .option("order_by", "id")  // Obligatorio: especifica ORDER BY al crear una tabla nueva
      .option("settings.allow_nullable_key", "1")  // Obligatorio en ClickHouse Cloud si ORDER BY incluye columnas que admiten NULL
      .mode("append")
      .save()
    ```
  </Tab>
</Tabs>

<Note>
  Este ejemplo asume que los secret scopes de Databricks ya están configurados. Para obtener instrucciones de configuración, consulta la [documentación de gestión de secretos de Databricks](https://docs.databricks.com/aws/en/security/secrets/).
</Note>

<div id="considerations">
  ## Consideraciones específicas de Databricks
</div>

<div id="access-mode">
  ### Requisitos del modo de acceso
</div>

El ClickHouse Spark Connector requiere el modo de acceso **Dedicated** (antes Single User). El modo de acceso **Standard** (antes Shared) no es compatible cuando Unity Catalog está habilitado, ya que Databricks bloquea los conectores externos DataSource V2 en esa configuración.

| Modo de acceso          | Unity Catalog | Compatible |
| ----------------------- | ------------- | ---------- |
| Dedicated (Single User) | Habilitado    | ✅ Sí       |
| Dedicated (Single User) | Deshabilitado | ✅ Sí       |
| Standard (Shared)       | Habilitado    | ❌ No       |
| Standard (Shared)       | Deshabilitado | ✅ Sí       |

<div id="secret-management">
  ### Gestión de secretos
</div>

Use los secret scopes de Databricks para guardar de forma segura las credenciales de ClickHouse:

```python theme={null}
# Acceder a los secretos
password = dbutils.secrets.get(scope="clickhouse", key="password")
```

Para obtener instrucciones de configuración, consulta la [documentación sobre gestión de secretos de Databricks](https://docs.databricks.com/aws/en/security/secrets/).

<div id="clickhouse-cloud">
  ### Conexión con ClickHouse Cloud
</div>

Al conectarse a ClickHouse Cloud desde Databricks:

1. Use **el protocolo HTTPS** (`protocol: https`, `http_port: 8443`)
2. Habilite **SSL** (`ssl: true`)

<div id="examples">
  ## Ejemplos
</div>

<div id="workflow-example">
  ### Ejemplo completo de flujo de trabajo
</div>

<Tabs>
  <Tab title="Python">
    ```python theme={null}
    from pyspark.sql import SparkSession
    from pyspark.sql.functions import col

    # Inicializar Spark con el conector de ClickHouse
    spark = SparkSession.builder \
        .config("spark.jars.packages", "com.clickhouse.spark:clickhouse-spark-runtime-3.4_2.12:0.9.0") \
        .getOrCreate()

    # Leer datos de ClickHouse
    df = spark.read \
        .format("clickhouse") \
        .option("host", "your-host.clickhouse.cloud") \
        .option("protocol", "https") \
        .option("http_port", "8443") \
        .option("database", "default") \
        .option("table", "source_table") \
        .option("user", "default") \
        .option("password", dbutils.secrets.get(scope="clickhouse", key="password")) \
        .option("ssl", "true") \
        .load()

    # Transformar los datos
    transformed_df = df.filter(col("status") == "active")

    # Escribir en ClickHouse
    transformed_df.write \
        .format("clickhouse") \
        .option("host", "your-host.clickhouse.cloud") \
        .option("protocol", "https") \
        .option("http_port", "8443") \
        .option("database", "default") \
        .option("table", "target_table") \
        .option("user", "default") \
        .option("password", dbutils.secrets.get(scope="clickhouse", key="password")) \
        .option("ssl", "true") \
        .option("order_by", "id") \
        .mode("append") \
        .save()
    ```
  </Tab>

  <Tab title="Scala">
    ```scala theme={null}
    import org.apache.spark.sql.SparkSession
    import org.apache.spark.sql.functions.col

    // Inicializar Spark con el conector de ClickHouse
    val spark = SparkSession.builder
      .config("spark.jars.packages", "com.clickhouse.spark:clickhouse-spark-runtime-3.4_2.12:0.9.0")
      .getOrCreate()

    // Leer datos de ClickHouse
    val df = spark.read
      .format("clickhouse")
      .option("host", "your-host.clickhouse.cloud")
      .option("protocol", "https")
      .option("http_port", "8443")
      .option("database", "default")
      .option("table", "source_table")
      .option("user", "default")
      .option("password", dbutils.secrets.get(scope="clickhouse", key="password"))
      .option("ssl", "true")
      .load()

    // Transformar los datos
    val transformedDF = df.filter(col("status") === "active")

    // Escribir en ClickHouse
    transformedDF.write
      .format("clickhouse")
      .option("host", "your-host.clickhouse.cloud")
      .option("protocol", "https")
      .option("http_port", "8443")
      .option("database", "default")
      .option("table", "target_table")
      .option("user", "default")
      .option("password", dbutils.secrets.get(scope="clickhouse", key="password"))
      .option("ssl", "true")
      .option("order_by", "id")
      .mode("append")
      .save()
    ```
  </Tab>
</Tabs>

<div id="related">
  ## Documentación relacionada
</div>

* [Guía del conector nativo de Spark](/es/integrations/connectors/data-ingestion/apache-spark/spark-native-connector) - Documentación completa del conector
* [Documentación de TableProvider API](/es/integrations/connectors/data-ingestion/apache-spark/spark-native-connector#using-the-tableprovider-api) - Detalles del acceso basado en formatos
* [Documentación de Catalog API](/es/integrations/connectors/data-ingestion/apache-spark/spark-native-connector#register-the-catalog-required) - Detalles del acceso basado en catálogos
