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

> Интеграция ClickHouse с Databricks

# Интеграция ClickHouse с 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
        </div>;
};

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

Коннектор ClickHouse Spark без проблем работает с Databricks. В этом руководстве описаны особенности настройки, установки и использования на платформе Databricks.

<div id="api-selection">
  ## Выбор API для Databricks
</div>

По умолчанию Databricks использует Unity Catalog, который блокирует регистрацию каталога Spark. В этом случае **необходимо** использовать **TableProvider API** (**доступ на основе формата**).

Однако если отключить Unity Catalog, создав кластер с режимом доступа **No isolation shared**, вместо него можно использовать **Catalog API**. Catalog API предоставляет централизованную конфигурацию и нативную интеграцию со Spark SQL.

| Статус Unity Catalog               | Рекомендуемый API                            | Примечания                                                |
| ---------------------------------- | -------------------------------------------- | --------------------------------------------------------- |
| **Включен** (по умолчанию)         | TableProvider API (доступ на основе формата) | Unity Catalog блокирует регистрацию каталога Spark        |
| **Отключен** (No isolation shared) | Catalog API                                  | Требуется кластер с режимом доступа "No isolation shared" |

<div id="installation">
  ## Установка в Databricks
</div>

<div id="installation-ui">
  ### Вариант 1: Загрузка JAR через интерфейс Databricks
</div>

1. Соберите или [скачайте](https://repo1.maven.org/maven2/com/clickhouse/spark/) runtime JAR-файл:
   ```bash theme={null}
   clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}-{{ stable_version }}.jar
   ```

2. Загрузите JAR-файл в рабочее пространство Databricks:
   * Перейдите в **Workspace** → Откройте нужную папку
   * Нажмите **Upload** → Выберите JAR-файл
   * JAR-файл будет сохранён в рабочем пространстве

3. Установите библиотеку на кластер:
   * Перейдите в **Compute** → Выберите кластер
   * Откройте вкладку **Libraries**
   * Нажмите **Install New**
   * Выберите **DBFS** или **Workspace** → Перейдите к загруженному JAR-файлу
   * Нажмите **Install**

<Image img={require('@site/images/integrations/data-ingestion/apache-spark/databricks/databricks-libraries-tab.png')} alt="Вкладка Libraries в Databricks" />

<Image img={require('@site/images/integrations/data-ingestion/apache-spark/databricks/databricks-install-from-volume.png')} alt="Установка библиотеки из тома рабочего пространства" />

4. Перезапустите кластер, чтобы загрузить библиотеку

<div id="installation-cli">
  ### Вариант 2: Установите через Databricks CLI
</div>

```bash theme={null}
# Загрузить JAR в DBFS
databricks fs cp clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}-{{ stable_version }}.jar \
  dbfs:/FileStore/jars/

# Установить на кластер
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">
  ### Вариант 3: координаты Maven (рекомендуется)
</div>

1. Перейдите в рабочее пространство Databricks:
   * Перейдите в **Compute** → выберите кластер
   * Откройте вкладку **Libraries**
   * Нажмите **Install New**
   * Выберите вкладку **Maven**

2. Добавьте координаты 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="Настройка библиотек Maven в Databricks" />

3. Нажмите **Install** и перезапустите кластер, чтобы загрузить библиотеку

<div id="tableprovider-api">
  ## Использование TableProvider API
</div>

Когда Unity Catalog включен (по умолчанию), **необходимо** использовать TableProvider API (доступ на основе формата), поскольку Unity Catalog блокирует регистрацию каталога Spark. Если вы отключили Unity Catalog, используя кластер с режимом доступа "No isolation shared", вместо этого можно использовать [Catalog API](/ru/integrations/connectors/data-ingestion/apache-spark/spark-native-connector#register-the-catalog-required).

<div id="reading-data-table-provider">
  ### Чтение данных
</div>

<Tabs>
  <Tab title="Python">
    ```python theme={null}
    # Чтение данных из ClickHouse с помощью 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()

    # Схема определяется автоматически
    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">
  ### Запись данных
</div>

<Tabs>
  <Tab title="Python">
    ```python theme={null}
    # Запись в ClickHouse — таблица будет создана автоматически, если её ещё не существует
    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") \  # Обязательно: укажите ORDER BY при создании новой таблицы
        .option("settings.allow_nullable_key", "1") \  # Обязательно для ClickHouse Cloud, если ORDER BY содержит столбцы с типом Nullable
        .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")  // Обязательно: укажите ORDER BY при создании новой таблицы
      .option("settings.allow_nullable_key", "1")  // Обязательно для ClickHouse Cloud, если ORDER BY содержит столбцы с типом Nullable
      .mode("append")
      .save()
    ```
  </Tab>
</Tabs>

<Note>
  В этом примере предполагается, что в Databricks уже настроены secret scopes. Инструкции по настройке см. в [документации Databricks по управлению секретами](https://docs.databricks.com/aws/en/security/secrets/).
</Note>

<div id="considerations">
  ## Особенности Databricks
</div>

<div id="access-mode">
  ### Требования к режиму доступа
</div>

Коннектор ClickHouse Spark требует режима доступа **Dedicated** (ранее — Single User). Режим доступа **Standard** (ранее — Shared) не поддерживается при включенном Unity Catalog, поскольку в такой конфигурации Databricks блокирует внешние коннекторы DataSource V2.

| Режим доступа           | Unity Catalog | Поддерживается |
| ----------------------- | ------------- | -------------- |
| Dedicated (Single User) | Включен       | ✅ Да           |
| Dedicated (Single User) | Отключен      | ✅ Да           |
| Standard (Shared)       | Включен       | ❌ Нет          |
| Standard (Shared)       | Отключен      | ✅ Да           |

<div id="secret-management">
  ### Управление секретами
</div>

Используйте secret scopes в Databricks для безопасного хранения учетных данных ClickHouse:

```python theme={null}
# Получение секретов
password = dbutils.secrets.get(scope="clickhouse", key="password")
```

Инструкции по настройке см. в [документации Databricks по управлению секретами](https://docs.databricks.com/aws/en/security/secrets/).

<div id="clickhouse-cloud">
  ### Подключение к ClickHouse Cloud
</div>

При подключении к ClickHouse Cloud из Databricks:

1. Используйте **протокол HTTPS** (`protocol: https`, `http_port: 8443`)
2. Включите **SSL** (`ssl: true`)

<div id="examples">
  ## Примеры
</div>

<div id="workflow-example">
  ### Полный пример рабочего процесса
</div>

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

    # Инициализируем Spark с коннектором ClickHouse
    spark = SparkSession.builder \
        .config("spark.jars.packages", "com.clickhouse.spark:clickhouse-spark-runtime-3.4_2.12:0.9.0") \
        .getOrCreate()

    # Читаем данные из 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()

    # Преобразуем данные
    transformed_df = df.filter(col("status") == "active")

    # Записываем данные в 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

    // Инициализируем Spark с коннектором ClickHouse
    val spark = SparkSession.builder
      .config("spark.jars.packages", "com.clickhouse.spark:clickhouse-spark-runtime-3.4_2.12:0.9.0")
      .getOrCreate()

    // Читаем данные из 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()

    // Преобразуем данные
    val transformedDF = df.filter(col("status") === "active")

    // Записываем данные в 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">
  ## Связанная документация
</div>

* [Руководство по Spark Native Connector](/ru/integrations/connectors/data-ingestion/apache-spark/spark-native-connector) - Полная документация по коннектору
* [Документация по TableProvider API](/ru/integrations/connectors/data-ingestion/apache-spark/spark-native-connector#using-the-tableprovider-api) - Подробная информация о доступе на основе формата
* [Документация по Catalog API](/ru/integrations/connectors/data-ingestion/apache-spark/spark-native-connector#register-the-catalog-required) - Подробная информация о доступе через каталог
