> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> С помощью dbt вы можете преобразовывать данные и создавать модели в ClickHouse

# Интеграция dbt с ClickHouse

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

<ClickHouseSupportedBadge />

<div id="dbt-clickhouse-adapter">
  ## Адаптер dbt-clickhouse
</div>

**dbt** (data build tool) позволяет аналитикам данных преобразовывать данные в своих хранилищах, просто записывая запросы SELECT. dbt материализует эти запросы SELECT в объекты базы данных в виде таблиц и представлений, то есть выполняет T в [Extract Load and Transform (ELT)](https://en.wikipedia.org/wiki/Extract,_load,_transform). Вы можете создать модель, определённую оператором SELECT.

В dbt эти модели можно связывать друг с другом и объединять в слои, что позволяет строить более высокоуровневые сущности. Шаблонный SQL, необходимый для связывания моделей, генерируется автоматически. Кроме того, dbt определяет зависимости между моделями и гарантирует, что они создаются в правильном порядке с помощью ориентированного ациклического графа (DAG).

dbt совместим с ClickHouse через [адаптер с поддержкой ClickHouse](https://github.com/ClickHouse/dbt-clickhouse).

<div id="related-pages">
  ## Связанные страницы
</div>

| Страница                                                                                                                      | Описание                                                    |
| ----------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- |
| [Возможности и конфигурации](/docs/ru/integrations/connectors/data-ingestion/etl-tools/dbt/features-and-configurations)            | Описание доступных возможностей и общих настроек            |
| [Материализации](/docs/ru/integrations/connectors/data-ingestion/etl-tools/dbt/materializations)                                   | Доступные материализации и их конфигурации                  |
| [Материализованные представления](/docs/ru/integrations/connectors/data-ingestion/etl-tools/dbt/materialization-materialized-view) | Подробная документация по материализации materialized\_view |
| [Руководства](/docs/ru/integrations/connectors/data-ingestion/etl-tools/dbt/guides)                                                | Руководства по использованию dbt с ClickHouse               |

<div id="supported-features">
  ## Поддерживаемые возможности
</div>

Список поддерживаемых возможностей:

* [x] Материализация таблиц
* [x] Материализация представлений
* [x] Инкрементальная материализация
* [x] Инкрементальная материализация Microbatch
* [x] Materialized View materializations (использует форму `TO` для MATERIALIZED VIEW, экспериментально)
* [x] Seeds
* [x] Источники
* [x] Генерация документации
* [x] Тесты
* [x] Снимки
* [x] Большинство макросов dbt-utils (теперь входят в dbt-core)
* [x] Эфемерная материализация
* [x] Материализация distributed таблиц (экспериментально)
* [x] Инкрементальная материализация distributed таблиц (экспериментально)
* [x] Контракты
* [x] Специфичные для ClickHouse конфигурации столбцов (кодек, TTL...)
* [x] Специфичные для ClickHouse настройки таблиц (индексы, проекции...)

Поддерживаются все возможности вплоть до dbt-core 1.10, включая флаг `--sample`; также устранены все предупреждения об устаревании для будущих версий. **Интеграции с каталогами** (например, Iceberg), появившиеся в dbt 1.10, пока не поддерживаются адаптером нативно, но доступны обходные решения. Подробности см. в [разделе Catalog Support](/docs/ru/integrations/connectors/data-ingestion/etl-tools/dbt/features-and-configurations#catalog-support).

Этот адаптер по-прежнему недоступен для использования в [dbt Cloud](https://docs.getdbt.com/docs/dbt-cloud/cloud-overview), но мы рассчитываем добавить его в ближайшее время. За дополнительной информацией обратитесь в службу поддержки.

<div id="concepts-and-supported-materializations">
  ## Концепции dbt и поддерживаемые материализации
</div>

dbt вводит понятие модели. Она определяется как SQL-оператор, который может объединять множество таблиц. Модель может быть «материализована» несколькими способами. Материализация представляет собой стратегию сборки для SELECT-запроса модели. Код материализации — это типовой SQL-код, который оборачивает ваш запрос `SELECT` в оператор, чтобы создать новое или обновить существующее отношение.

dbt предоставляет 5 типов материализации. Все они поддерживаются `dbt-clickhouse`:

* **view** (по умолчанию): Модель создаётся как представление в базе данных. В ClickHouse это создаётся как [view](/docs/ru/reference/statements/create/view).
* **table**: Модель создаётся как таблица в базе данных. В ClickHouse это создаётся как [table](/docs/ru/reference/statements/create/table).
* **ephemeral**: Модель не создаётся напрямую в базе данных, а подставляется в зависимые модели как CTE (Common Table Expressions, общие табличные выражения).
* **incremental**: Изначально модель материализуется как таблица, а при последующих запусках dbt выполняет вставку новых строк и обновляет изменённые строки в таблице.
* **materialized view**: Модель создаётся как materialized view в базе данных. В ClickHouse это создаётся как [materialized view](/docs/ru/reference/statements/create/view#materialized-view).

Дополнительные синтаксические конструкции и секции определяют, как эти модели должны обновляться при изменении лежащих в их основе данных. Как правило, dbt рекомендует начинать с материализации view, пока производительность не станет критичной. Материализация table повышает производительность на этапе выполнения запроса, сохраняя результаты запроса модели в виде таблицы, но ценой увеличения объёма хранилища. Подход incremental развивает эту идею дальше, позволяя фиксировать последующие обновления исходных данных в целевой таблице.

[Текущий адаптер](https://github.com/silentsokolov/dbt-clickhouse) для ClickHouse также поддерживает материализации **dictionary**, **distributed table** и **distributed incremental**. Адаптер также поддерживает dbt [снимки](https://docs.getdbt.com/docs/building-a-dbt-project/snapshots#check-strategy) и [seed](https://docs.getdbt.com/docs/building-a-dbt-project/seeds).

Ниже перечислены [экспериментальные возможности](/docs/ru/reference/settings/beta-and-experimental-features) в `dbt-clickhouse`:

| Тип                                    | Поддерживается?                              | Подробности                                                                                                                                                                                                                                                                                                    |
| -------------------------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Материализация Materialized View       | Да. Создание с явной целевой таблицей — бета | Создаёт [materialized view](/docs/ru/reference/statements/create/view#materialized-view).                                                                                                                                                                                                                           |
| Материализация Distributed table       | Да, экспериментальная                        | Создаёт [distributed таблица](/docs/ru/reference/engines/table-engines/special/distributed).                                                                                                                                                                                                                        |
| Материализация Distributed incremental | Да, экспериментальная                        | Инкрементальная модель, основанная на той же идее, что и distributed table. Обратите внимание, что поддерживаются не все стратегии; подробнее см. в [соответствующем разделе документации](/docs/ru/integrations/connectors/data-ingestion/etl-tools/dbt/materializations#materialization-distributed-incremental). |
| Материализация Dictionary              | Да, экспериментальная                        | Создаёт [словарь](/docs/ru/reference/engines/table-engines/special/dictionary).                                                                                                                                                                                                                                     |

<div id="setup-of-dbt-and-the-clickhouse-adapter">
  ## Настройка dbt и адаптера ClickHouse
</div>

<div id="install-dbt-core-and-dbt-clickhouse">
  ### Установите dbt-core и dbt-clickhouse
</div>

dbt предлагает несколько способов установки интерфейса командной строки (CLI); они подробно описаны [здесь](https://docs.getdbt.com/dbt-cli/install/overview). Мы рекомендуем устанавливать и dbt, и dbt-clickhouse с помощью `pip`.

```sh theme={null}
pip install dbt-core dbt-clickhouse
```

<div id="provide-dbt-with-the-connection-details-for-our-clickhouse-instance">
  ### Укажите в dbt сведения о подключении к нашему экземпляру ClickHouse.
</div>

Настройте профиль `clickhouse-service` в файле `~/.dbt/profiles.yml` и задайте свойства `schema`, `host`, `port`, `user` и `password`. Полный список параметров конфигурации подключения доступен на странице [Возможности и конфигурации](/docs/ru/integrations/connectors/data-ingestion/etl-tools/dbt/features-and-configurations):

```yaml theme={null}
clickhouse-service:
  target: dev
  outputs:
    dev:
      type: clickhouse
      schema: [ default ] # База данных ClickHouse для dbt-моделей

      # Необязательно
      host: [ localhost ]
      port: [ 8123 ]  # По умолчанию 8123, 8443, 9000, 9440 в зависимости от настроек secure и driver 
      user: [ default ] # Пользователь для всех операций с базой данных
      password: [ <empty string> ] # Пароль пользователя
      secure: True  # Использовать TLS (собственный протокол) или HTTPS (HTTP-протокол)
```

<div id="create-a-dbt-project">
  ### Создайте проект в dbt
</div>

Теперь вы можете использовать этот профиль в одном из существующих проектов или создать новый с помощью:

```sh theme={null}
dbt init project_name
```

В каталоге `project_name` обновите файл `dbt_project.yml`, указав имя профиля для подключения к серверу ClickHouse.

```yaml theme={null}
profile: 'clickhouse-service'
```

<div id="test-connection">
  ### Проверка подключения
</div>

Выполните команду `dbt debug` в CLI, чтобы проверить, может ли dbt подключиться к ClickHouse. Убедитесь, что в ответе есть строка `Connection test: [OK connection ok]`, которая указывает на успешное подключение.

Перейдите на [страницу руководств](/docs/ru/integrations/connectors/data-ingestion/etl-tools/dbt/guides), чтобы узнать больше об использовании dbt с ClickHouse.

<div id="testing-and-deploying-your-models-ci-cd">
  ### Тестирование и развертывание ваших моделей (CI/CD)
</div>

Существует множество способов тестирования и развертывания вашего dbt-проекта. dbt предлагает рекомендации по [лучшим практикам организации рабочих процессов](https://docs.getdbt.com/best-practices/best-practice-workflows#pro-tips-for-workflows) и [CI-задачам](https://docs.getdbt.com/docs/deploy/ci-jobs). Мы рассмотрим несколько стратегий, но имейте в виду, что их, возможно, потребуется существенно адаптировать под ваш конкретный сценарий использования.

<div id="ci-with-simple-data-tests-and-unit-tests">
  #### CI/CD с простыми тестами данных и модульными тестами
</div>

Один из простых способов быстро запустить CI-конвейер — поднять кластер ClickHouse в рамках задачи, а затем запустить на нём ваши модели. Перед запуском моделей в этот кластер можно вставить тестовые данные. Для заполнения промежуточного окружения частью данных из продакшн-окружения можно просто использовать [seed](https://docs.getdbt.com/reference/commands/seed).

После вставки данных вы можете запустить [тесты данных](https://docs.getdbt.com/docs/build/data-tests) и [модульные тесты](https://docs.getdbt.com/docs/build/unit-tests).

Шаг CD может быть таким же простым, как запуск `dbt build` на продакшн-кластере ClickHouse.

<div id="more-complete-ci-stage">
  #### Более полный этап CI/CD: используйте свежие данные и тестируйте только затронутые модели
</div>

Одна из распространённых стратегий — использовать задачи [Slim CI](https://docs.getdbt.com/best-practices/best-practice-workflows#run-only-modified-models-to-test-changes-slim-ci), при которых повторно развертываются только изменённые модели (и их зависимости выше и ниже по графу). Этот подход использует артефакты из запусков в продакшн (то есть [манифест dbt](https://docs.getdbt.com/reference/artifacts/manifest-json)), чтобы сократить время выполнения проекта и избежать расхождения схем между средами.

Чтобы среды разработки оставались синхронизированными и модели не запускались на устаревших развертываниях, можно использовать [clone](https://docs.getdbt.com/reference/commands/clone) или даже [defer](https://docs.getdbt.com/reference/node-selection/defer).

Мы рекомендуем использовать выделенный кластер или сервис ClickHouse для тестовой среды (то есть staging-среды), чтобы не влиять на работу вашей среды продакшн. Чтобы тестовая среда была репрезентативной, важно использовать подмножество данных из продакшн, а также запускать dbt так, чтобы не допускать расхождения схем между средами.

* Если вам не нужны свежие данные для тестирования, можно восстановить резервную копию данных из продакшн в staging-среду.
* Если вам нужны свежие данные для тестирования, можно использовать сочетание [table function `remoteSecure()`](/docs/ru/reference/functions/table-functions/remote) и refreshable materialized views, чтобы выполнять вставку с нужной частотой. Другой вариант — использовать Объектное хранилище как промежуточное хранилище, периодически записывать в него данные из вашего продакшн-сервиса, а затем импортировать их в staging-среду с помощью table functions для Объектного хранилища или ClickPipes (для непрерывной ингестии).

Использование выделенной среды для CI-тестирования также позволяет проводить ручное тестирование, не затрагивая среду продакшн. Например, для тестирования можно подключить BI-инструмент к этой среде.

Для развертывания (то есть шага CD) мы рекомендуем использовать артефакты из ваших развертываний в продакшн, чтобы обновлять только те модели, которые изменились. Для этого нужно настроить Объектное хранилище (например, S3) как промежуточное хранилище для артефактов dbt. После этого можно запускать команду вида `dbt build --select state:modified+ --state path/to/last/deploy/state.json`, чтобы выборочно пересобирать минимально необходимое количество моделей на основе изменений с момента последнего запуска в продакшн.

<div id="troubleshooting-common-issues">
  ## Устранение типичных неполадок
</div>

<div id="troubleshooting-connections">
  ### Подключения
</div>

Если у вас возникают проблемы с подключением к ClickHouse из dbt, убедитесь, что выполнены следующие условия:

* Движок должен быть одним из [поддерживаемых движков](/docs/ru/integrations/connectors/data-ingestion/etl-tools/dbt/materializations#supported-table-engines).
* У вас должны быть достаточные разрешения на доступ к базе данных.
* Если вы не используете движок таблицы по умолчанию для базы данных, необходимо указать движок таблицы в конфигурации
  модели.

<div id="understanding-long-running-operations">
  ### Понимание длительно выполняющихся операций
</div>

Некоторые операции могут занимать больше времени, чем ожидается, из-за отдельных запросов ClickHouse. Чтобы лучше понять, какие запросы выполняются дольше, повысьте [уровень логирования](https://docs.getdbt.com/reference/global-configs/logs#log-level) до `debug` — тогда будет выводиться время выполнения каждого запроса. Например, для этого можно добавить `--log-level debug` к командам dbt.

<div id="limitations">
  ## Ограничения
</div>

У текущего адаптера ClickHouse для dbt есть несколько ограничений, о которых следует знать:

* Плагин использует синтаксис, требующий ClickHouse версии 25.3 или новее. Более старые версии ClickHouse мы не тестируем. Также в настоящее время мы не тестируем таблицы Replicated.
* Разные запуски `dbt-adapter` могут конфликтовать, если выполняются одновременно, поскольку внутри они могут использовать одинаковые имена таблиц для одних и тех же операций. Подробнее см. issue [#420](https://github.com/ClickHouse/dbt-clickhouse/issues/420).
* Сейчас адаптер материализует модели в виде таблиц с использованием [INSERT INTO SELECT](/docs/ru/reference/statements/insert-into#inserting-the-results-of-select). На практике это означает дублирование данных при повторном запуске. Очень большие датасеты (PB) могут приводить к крайне долгому времени выполнения, из-за чего некоторые модели становятся непрактичными. Чтобы повысить производительность, используйте materialized views ClickHouse, реализуя представление как `materialized: materialization_view`. Кроме того, старайтесь по возможности уменьшать количество строк, возвращаемых любым запросом, используя `GROUP BY`. Предпочтительнее модели, которые агрегируют данные, а не просто преобразуют их, сохраняя количество строк источника.
* Чтобы использовать Distributed tables для представления модели, необходимо вручную создать базовые реплицируемые таблицы на каждом узле. Затем поверх них можно создать Distributed таблицу. Адаптер не управляет созданием cluster.
* Когда dbt создает отношение (table/view) в database, оно обычно создается в виде: `{{ database }}.{{ schema }}.{{ table/view id }}`. В ClickHouse нет понятия схем. Поэтому адаптер использует `{{schema}}.{{ table/view id }}`, где `schema` — это database ClickHouse.
* Эфемерные модели/CTE не работают, если размещены перед `INSERT INTO` в операторе вставки ClickHouse, см. [https://github.com/ClickHouse/ClickHouse/issues/30323](https://github.com/ClickHouse/ClickHouse/issues/30323). Это не должно затрагивать большинство моделей, но следует учитывать, где именно эфемерная модель размещается в определениях моделей и других SQL-командах. {/* TODO проверить это ограничение, похоже, issue уже был закрыт, а исправление добавлено в 24.10 */}

<div id="fivetran">
  ## Fivetran
</div>

Коннектор `dbt-clickhouse` также можно использовать в [трансформациях Fivetran](https://fivetran.com/docs/transformations/dbt), что обеспечивает бесшовную интеграцию и возможность преобразования данных непосредственно в платформе Fivetran с помощью `dbt`.
