> ## 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.

> Описание доступных возможностей и общих настроек

# Возможности и конфигурации

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>;
};

В этом разделе описаны некоторые возможности dbt для ClickHouse.

<div id="profile-yml-configurations">
  ## Настройки Profile.yml
</div>

Чтобы подключить dbt к ClickHouse, нужно добавить [профиль](https://docs.getdbt.com/docs/core/connect-data-platform/connection-profiles) в файл `profiles.yml`. Профиль ClickHouse имеет следующий синтаксис:

```yaml theme={null}
your_profile_name:
  target: dev
  outputs:
    dev:
      type: clickhouse

      # Необязательно
      schema: [default] # База данных ClickHouse для моделей dbt
      driver: [http] # http или native. Если не задано, определяется автоматически на основе настройки порта
      host: [localhost] 
      port: [8123]  # Если не задано, по умолчанию используется 8123, 8443, 9000 или 9440 в зависимости от настроек secure и driver 
      user: [default] # Пользователь для всех операций с базой данных
      password: [<empty string>] # Пароль пользователя
      cluster: [<empty string>] # Если задано, определённые DDL-операции и операции с таблицами будут выполняться с предложением ON CLUSTER для указанного кластера. Для работы распределённой материализации эта настройка обязательна. Подробнее см. раздел кластера ClickHouse ниже.
      verify: [True] # Проверять TLS-сертификат при использовании TLS/SSL
      secure: [False] # Использовать TLS (собственный протокол) или HTTPS (HTTP-протокол)
      client_cert: [null] # Путь к TLS-сертификату клиента в формате .pem
      client_cert_key: [null] # Путь к закрытому ключу TLS-сертификата клиента
      retries: [1] # Количество повторных попыток при «повторяемом» исключении базы данных (например, ошибка 503 'Service Unavailable')
      compression: [<empty string>] # Использовать сжатие gzip, если значение истинно (http), или тип сжатия для нативного соединения
      connect_timeout: [10] # Тайм-аут в секундах для установки соединения с ClickHouse
      send_receive_timeout: [300] # Тайм-аут в секундах для получения данных от сервера ClickHouse
      cluster_mode: [False] # Использовать специальные настройки для улучшения работы с Replicated-базами данных (рекомендуется для ClickHouse Cloud)
      use_lw_deletes: [False] # Использовать стратегию `delete+insert` в качестве стратегии incremental по умолчанию.
      check_exchange: [True] # Проверить, поддерживает ли ClickHouse атомарную команду EXCHANGE TABLES. (Не требуется для большинства версий ClickHouse)
      local_suffix: [_local] # Суффикс имени локальных таблиц на сегментах при распределённой материализации.
      local_db_prefix: [<empty string>] # Префикс базы данных для локальных таблиц на сегментах при распределённой материализации. Если не задано, используется та же база данных, что и у distributed таблицы.
      allow_automatic_deduplication: [False] # Включить автоматическую дедупликацию ClickHouse для Replicated-таблиц
      tcp_keepalive: [False] # Только для нативного клиента: задать конфигурацию TCP keepalive. Пользовательские параметры keepalive указываются в формате [idle_time_sec, interval_sec, probes].
      custom_settings: [{}] # Словарь/отображение пользовательских настроек ClickHouse для соединения — по умолчанию пусто.
      database_engine: '' # Движок базы данных, используемый при создании новых схем ClickHouse (баз данных). Если не задано (по умолчанию), новые базы данных будут использовать движок ClickHouse по умолчанию (обычно Atomic).
      threads: [1] # Количество потоков для выполнения запросов. Перед установкой значения больше 1 обязательно ознакомьтесь с разделом [согласованность чтения после записи](#read-after-write-consistency).
      
      # Настройки нативного соединения (clickhouse-driver)
      sync_request_timeout: [5] # Тайм-аут для Ping сервера
      compress_block_size: [1048576] # Размер блока сжатия, если сжатие включено
```

<div id="schema-vs-database">
  ### Схема и база данных
</div>

Идентификатор отношения модели dbt `database.schema.table` несовместим с ClickHouse, поскольку ClickHouse не
поддерживает `schema`.
Поэтому используется упрощённый вариант `schema.table`, где `schema` — это база данных ClickHouse. Использовать базу данных `default`
не рекомендуется.

<div id="set-statement-warning">
  ### Предупреждение об операторе SET
</div>

Во многих средах использование оператора SET для сохранения настройки ClickHouse во всех запросах DBT ненадежно
и может приводить к неожиданным сбоям. Это особенно актуально при использовании HTTP-соединений через балансировщик нагрузки,
который распределяет запросы между несколькими узлами (например, в ClickHouse Cloud), хотя в некоторых случаях это также
может происходить и при использовании нативных соединений ClickHouse. Поэтому в качестве рекомендуемой практики мы советуем
задавать все необходимые настройки ClickHouse в свойстве "custom\_settings" профиля DBT, а не полагаться на pre-hook-оператор "SET",
как иногда рекомендуется.

<div id="setting-quote_columns">
  ### Настройка `quote_columns`
</div>

Чтобы избежать предупреждения, явно задайте значение `quote_columns` в файле `dbt_project.yml`. Подробнее см. в [документации по quote\_columns](https://docs.getdbt.com/reference/resource-configs/quote_columns).

```yaml theme={null}
seeds:
  +quote_columns: false  #или `true`, если заголовки столбцов CSV содержат пробелы
```

<div id="about-the-clickhouse-cluster">
  ### О кластере ClickHouse
</div>

При использовании кластера ClickHouse нужно учитывать две вещи:

* Настройку параметра `cluster`.
* Обеспечение согласованности чтения после записи, особенно если вы используете более одного `threads`.

<div id="cluster-setting">
  #### Параметр `cluster`
</div>

Параметр `cluster` в профиле позволяет dbt-clickhouse работать с кластером ClickHouse. Если в профиле задан `cluster`, **по умолчанию все модели будут создаваться с предложением `ON CLUSTER`** — кроме тех, которые используют движок **Replicated**. Сюда входят:

* Создание базы данных
* Материализации представлений
* Материализации таблиц и incremental-моделей
* Распределённая материализация

Для движков Replicated предложение `ON CLUSTER` **не** добавляется, поскольку они сами управляют репликацией.

Чтобы **отключить** создание через кластер для конкретной модели, добавьте config `disable_on_cluster`:

```sql theme={null}
{{ config(
        engine='MergeTree',
        materialized='table',
        disable_on_cluster='true'
    )
}}

```

Материализации table и incremental с нереплицируемым движком не будут зависеть от настройки `cluster` (модель
будет создана только на том узле, к которому установлено подключение).

**Совместимость**

Если модель была создана без настройки `cluster`, dbt-clickhouse обнаружит это и выполнит все DDL/DML
без предложения `on cluster` для этой модели.

<div id="read-after-write-consistency">
  #### Согласованность чтения после записи
</div>

dbt использует модель согласованности чтения после вставки. Она несовместима с кластерами ClickHouse, в которых больше одной реплики, если нельзя гарантировать, что все операции будут направляться в одну и ту же реплику. В повседневной работе с dbt вы можете и не столкнуться с проблемами, но в зависимости от конфигурации кластера есть несколько способов обеспечить такую гарантию:

* Если вы используете кластер ClickHouse Cloud, достаточно задать `select_sequential_consistency: 1` в свойстве `custom_settings` вашего профиля. Подробнее об этой настройке можно узнать [здесь](/ru/reference/settings/session-settings#select_sequential_consistency).
* Если вы используете самоуправляемый кластер, убедитесь, что все запросы dbt отправляются в одну и ту же реплику ClickHouse. Если перед ним установлен балансировщик нагрузки, попробуйте использовать механизм `replica aware routing`/`sticky sessions`, чтобы всегда попадать в одну и ту же реплику. Добавлять настройку `select_sequential_consistency = 1` в кластерах вне ClickHouse Cloud [не рекомендуется](/ru/reference/settings/session-settings#select_sequential_consistency).

<div id="additional-clickhouse-macros">
  ## Дополнительные макросы ClickHouse
</div>

<div id="model-materialization-utility-macros">
  ### Вспомогательные макросы материализации моделей
</div>

Следующие макросы включены для упрощения создания таблиц и представлений ClickHouse:

* `engine_clause` -- Использует свойство конфигурации model `engine` для назначения движка таблицы ClickHouse. dbt-clickhouse
  по умолчанию использует движок `MergeTree`.
* `partition_cols` -- Использует свойство конфигурации model `partition_by` для назначения ключа партиционирования ClickHouse. По умолчанию
  ключ партиционирования не назначается.
* `order_cols` -- Использует конфигурацию model `order_by` для назначения ключа сортировки ClickHouse (ORDER BY). Если не указано,
  ClickHouse будет использовать пустой `tuple()`, и таблица не будет отсортирована
* `primary_key_clause` -- Использует свойство конфигурации model `primary_key` для назначения первичного ключа ClickHouse. По
  умолчанию первичный ключ задан, и ClickHouse будет использовать предложение ORDER BY в качестве первичного ключа.
* `on_cluster_clause` -- Использует свойство профиля `cluster` для добавления предложения `ON CLUSTER` к некоторым операциям dbt:
  распределённым материализациям, созданию представлений, созданию баз данных.
* `ttl_config` -- Использует свойство конфигурации model `ttl` для назначения выражения TTL таблицы ClickHouse. По умолчанию TTL не
  назначается.

<div id="s3source-helper-macro">
  ### Вспомогательный макрос s3Source
</div>

Макрос `s3source` упрощает выборку данных ClickHouse напрямую из S3 с помощью табличной функции S3 в ClickHouse. Он работает,
подставляя параметры табличной функции S3 из именованного словаря конфигурации (имя словаря должно оканчиваться
на `s3`). Макрос
сначала ищет словарь в `vars` профиля, а затем в конфигурации модели. Словарь может содержать
любые из следующих
ключей, используемых для заполнения параметров табличной функции S3:

| Имя аргумента            | Описание                                                                                                                                                                                       |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| bucket                   | Базовый URL бакета, например `https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi`. Если протокол не указан, предполагается `https://`.                                         |
| path                     | Путь S3, используемый в запросе к таблице, например `/trips_4.gz`. Поддерживаются подстановочные шаблоны S3.                                                                                   |
| fmt                      | Ожидаемый input format ClickHouse (например, `TSV` или `CSVWithNames`) для указанных объектов S3.                                                                                              |
| structure                | Структура столбцов данных в бакете в виде списка пар имя/тип данных, например `['id UInt32', 'date DateTime', 'value String']`. Если не указано, ClickHouse определит структуру автоматически. |
| aws\_access\_key\_id     | Идентификатор ключа доступа S3.                                                                                                                                                                |
| aws\_secret\_access\_key | Секретный ключ S3.                                                                                                                                                                             |
| role\_arn                | ARN роли IAM ClickhouseAccess, используемой для безопасного доступа к объектам S3. Подробнее см. в этой [документации](/ru/products/cloud/guides/data-sources/accessing-s3-data-securely).     |
| compression              | Метод сжатия, используемый для объектов S3. Если не указан, ClickHouse попытается определить тип сжатия по имени файла.                                                                        |

См.
[тестовый файл S3](https://github.com/ClickHouse/dbt-clickhouse/blob/main/tests/integration/adapter/clickhouse/test_clickhouse_s3.py)
с примерами использования этого макроса.

<div id="cross-database-macro-support">
  ### Поддержка макросов для разных баз данных
</div>

dbt-clickhouse теперь поддерживает большинство макросов для разных баз данных, включённых в `dbt Core`, за следующими исключениями:

* SQL-функция `split_part` реализована в ClickHouse с помощью функции splitByChar. Эта функция требует
  использования константной строки в качестве разделителя для `split`, поэтому параметр `delimeter`, используемый в этом макросе, будет
  интерпретироваться как строка, а не как имя столбца
* Аналогично, SQL-функция `replace` в ClickHouse требует константных строк для параметров `old_chars` и `new_chars`,
  поэтому при вызове этого макроса эти параметры будут интерпретироваться как строки, а не как имена столбцов.

<div id="catalog-support">
  ## Поддержка каталога
</div>

<div id="dbt-catalog-integration-status">
  ### Статус интеграции с каталогом в dbt
</div>

В dbt Core v1.10 появилась поддержка интеграции с каталогами, которая позволяет адаптерам материализовывать модели во внешние каталоги, управляющие открытыми табличными форматами, такими как Apache Iceberg. **Эта возможность пока ещё не реализована в dbt-clickhouse на нативном уровне.** Отслеживать ход реализации этой возможности можно в [issue #489 на GitHub](https://github.com/ClickHouse/dbt-clickhouse/issues/489).

<div id="clickhouse-catalog-support">
  ### Поддержка каталогов в ClickHouse
</div>

Недавно ClickHouse добавил встроенную поддержку таблиц Apache Iceberg и каталогов данных. Большинство возможностей всё ещё имеют статус `experimental`, но ими уже можно пользоваться, если у вас установлена актуальная версия ClickHouse.

* Вы можете использовать ClickHouse, чтобы **выполнять запросы к таблицам Iceberg, хранящимся в объектном хранилище** (S3, Azure Blob Storage, Google Cloud Storage), с помощью [движка таблицы Iceberg](/ru/reference/engines/table-engines/integrations/iceberg) и [табличной функции iceberg](/ru/reference/functions/table-functions/iceberg).

* Кроме того, ClickHouse предоставляет [движок базы данных DataLakeCatalog](/ru/reference/engines/database-engines/datalake), который позволяет **подключаться к внешним каталогам данных**, включая Каталог AWS Glue, Databricks Unity Catalog, Hive Metastore и REST-каталоги. Это позволяет напрямую выполнять запросы к данным в открытых табличных форматах (Iceberg, Delta Lake) из внешних каталогов без дублирования данных.

<div id="workarounds-iceberg-catalogs">
  ### Обходные решения для работы с Iceberg и каталогами
</div>

Вы можете читать данные из таблиц Iceberg или каталогов в своем проекте dbt, если уже настроили их в кластере ClickHouse с помощью описанных выше инструментов. Для обращения к этим таблицам в проектах dbt можно использовать функциональность `source`. Например, если вы хотите получить доступ к своим таблицам в REST Catalog, вы можете:

1. **Создать базу данных, указывающую на внешний каталог:**

```sql theme={null}
-- Пример с REST-каталогом
SET allow_experimental_database_iceberg = 1;

CREATE DATABASE iceberg_catalog
ENGINE = DataLakeCatalog('http://rest:8181/v1', 'admin', 'password')
SETTINGS 
    catalog_type = 'rest', 
    storage_endpoint = 'http://minio:9000/lakehouse', 
    warehouse = 'demo'
```

2. **Определите базу данных каталога и её таблицы как источники в dbt:** убедитесь, что эти таблицы уже доступны в ClickHouse

```yaml theme={null}
version: 2

sources:
  - name: external_catalog
    database: iceberg_catalog
    tables:
      - name: orders
      - name: customers
```

3. **Используйте таблицы каталога в моделях dbt:**

```sql theme={null}
SELECT 
    o.order_id,
    c.customer_name,
    o.order_date
FROM {{ source('external_catalog', 'orders') }} o
INNER JOIN {{ source('external_catalog', 'customers') }} c
    ON o.customer_id = c.customer_id
```

<div id="benefits-workarounds">
  ### Примечания по обходным решениям
</div>

Преимущества этих обходных решений:

* Вы получите немедленный доступ к различным типам внешних таблиц и внешним каталогам без необходимости ждать появления встроенной интеграции каталогов в dbt.
* У вас будет плавный путь миграции, когда станет доступна встроенная поддержка каталогов.

Но сейчас есть и некоторые ограничения:

* **Ручная настройка:** таблицы Iceberg и базы данных каталогов необходимо создавать вручную в ClickHouse, прежде чем на них можно будет ссылаться в dbt.
* **Нет DDL на уровне каталога:** dbt не может управлять операциями на уровне каталога, такими как создание или удаление таблиц Iceberg во внешних каталогах. Поэтому сейчас вы не сможете создавать их из коннектора dbt. Возможность создания таблиц с движками Iceberg() может появиться в будущем.
* **Операции записи:** В настоящее время возможности записи в таблицы Iceberg/Data Catalog ограничены. Ознакомьтесь с документацией ClickHouse, чтобы понять, какие варианты доступны.
