Открыть сервис

dbt-duckdb

dbt-duckdb — это адаптер (плагин) для инструмента трансформации данных dbt (data build tool), предназначенный для работы с in-process СУБД DuckDB. Он позволяет выполнять SQL-преобразования данных, написанные в рамках dbt, непосредственно в движке DuckDB, минуя развёртывание отдельного сервера базы данных.

История и предпосылки

Проект dbt-duckdb возник как ответ на потребность в лёгком и быстром инструменте для аналитической обработки данных, не требующем сложной инфраструктуры. DuckDB, встраиваемая колоночная СУБД, оптимизирована для аналитических запросов и может работать как в памяти, так и с файлами на диске. dbt, в свою очередь, является стандартом де-факто для трансформации данных в современных аналитических конвейерах (data pipelines). Объединение этих двух инструментов позволило аналитикам и инженерам данных выполнять те же задачи, что и с полноценными облачными хранилищами (например, Snowflake, BigQuery, Redshift), но на локальной машине или в однопроцессной среде.

Первая публичная версия адаптера была выпущена в 2021 году. Разработка ведётся сообществом, ключевым вкладом занимается компания MotherDuck (разработчик облачной версии DuckDB). Адаптер поддерживает все основные возможности dbt, включая материализации (таблицы, представления, инкрементальные модели), тесты, документацию и генерацию артефактов.

Архитектура и принцип работы

dbt-duckdb не требует установки DuckDB как отдельного сервера. Вместо этого он использует Python-библиотеку duckdb, которая загружает движок СУБД непосредственно в процесс Python. Это означает, что все операции выполняются в рамках одного процесса, без сетевых вызовов и накладных расходов на управление соединениями.

Основные компоненты

  • Профиль подключения: В файле profiles.yml указывается тип адаптера (duckdb), путь к файлу базы данных (если требуется сохранять данные на диск), а также параметры, такие как количество потоков и размер памяти. Если путь не указан, DuckDB работает в режиме in-memory.
  • Модели dbt: SQL-файлы с SELECT-запросами, которые определяют, как преобразовывать исходные данные в выходные наборы. Адаптер транслирует эти запросы напрямую в DuckDB.
  • Материализации: Поддерживаются стандартные для dbt способы хранения результатов:
  • table — создание физической таблицы.
  • view — создание представления.
  • incremental — инкрементальная загрузка, где новые данные добавляются к существующей таблице.
  • ephemeral — временная модель, существующая только в рамках одного сеанса.
  • Плагины и расширения: DuckDB поддерживает расширения (например, для чтения Parquet, JSON, CSV, а также для работы с геопространственными данными через spatial). Адаптер позволяет загружать эти расширения через конфигурацию профиля.

Особенности работы с файлами

Одной из ключевых особенностей dbt-duckdb является возможность напрямую читать и писать файлы в форматах Parquet, CSV, JSON и других. Это позволяет использовать DuckDB как «виртуальную» базу данных, которая не требует импорта данных в собственный формат. Например, модель может читать Parquet-файлы из S3 или локальной файловой системы, преобразовывать их и записывать результат обратно в Parquet. Это делает адаптер популярным для ETL/ELT-процессов, где данные уже хранятся в файловых хранилищах (Data Lake).

Применение

dbt-duckdb используется в нескольких основных сценариях:

Локальная разработка и тестирование

Аналитики и инженеры данных часто применяют dbt-duckdb для быстрой проверки SQL-моделей на локальной машине, не подключаясь к дорогостоящим облачным хранилищам. Это позволяет отлаживать логику трансформаций, тестировать гипотезы и проверять качество данных до развёртывания в production-среде.

Анализ данных на одном компьютере

Для небольших объёмов данных (до десятков гигабайт) dbt-duckdb может полностью заменить полноценную базу данных. Пользователь может запускать dbt-проекты, которые читают данные из CSV-файлов, Excel-таблиц или Parquet, и получать результаты в виде отчётов или датасетов.

Обработка данных в Data Lake

Благодаря встроенной поддержке Parquet и интеграции с объектными хранилищами (S3, GCS, Azure Blob), dbt-duckdb часто используется для трансформации данных непосредственно в формате Data Lake. Это позволяет избежать этапа загрузки данных в отдельную БД.

Обучение и прототипирование

Адаптер популярен в образовательных целях, так как не требует установки сложной инфраструктуры. Студенты и участники курсов по dbt могут быстро развернуть рабочую среду на своём ноутбуке.

Преимущества и ограничения

Преимущества

  • Простота установки и настройки: Не требуется администрирование базы данных. Достаточно установить Python-пакет dbt-duckdb.
  • Высокая производительность для аналитических запросов: DuckDB использует векторизованное выполнение и колоночное хранение, что обеспечивает скорость, сопоставимую с коммерческими СУБД, на объёмах данных до 100 ГБ.
  • Нулевая стоимость: DuckDB — open-source проект с лицензией MIT. Отсутствие затрат на лицензирование и серверные мощности.
  • Поддержка современных форматов: Parquet, Arrow, Iceberg (через расширения).
  • Интеграция с экосистемой Python: Возможность использовать Python-скрипты внутри моделей dbt (через макросы или плагины).

Ограничения

  • Однопроцессная архитектура: DuckDB не поддерживает распределённые вычисления. Для обработки данных объёмом более 100–200 ГБ на одном узле производительность может снижаться.
  • Отсутствие многопользовательского доступа: DuckDB не предназначен для одновременной работы множества пользователей. Это инструмент для однопользовательского или batch-режима.
  • Ограниченная поддержка DML-операций: В отличие от PostgreSQL или MySQL, DuckDB не поддерживает полноценные UPDATE и DELETE с произвольными условиями (хотя в последних версиях появилась поддержка).
  • Зависимость от Python: Для работы адаптера требуется среда Python, что может быть неудобно в некоторых инфраструктурах.

Пример использования

Типичный профиль для dbt-duckdb выглядит следующим образом:

```yaml

profiles.yml

my_project: target: dev outputs: dev: type: duckdb path: "my_database.duckdb" threads: 4 extensions:

  • parquet
  • httpfs

settings: memory_limit: "8GB" ```

После настройки профиля пользователь может запускать стандартные команды dbt:

``bash dbt run dbt test dbt docs generate ``

Сообщество и развитие

Проект активно развивается. Основные коммиты вносятся разработчиками из MotherDuck и сообщества dbt. Адаптер поддерживает версии dbt от 1.0 и выше. Регулярно выходят обновления, добавляющие поддержку новых функций DuckDB (например, Iceberg, Delta Lake, Full-Text Search).

В официальной документации dbt-duckdb приведены примеры интеграции с различными источниками данных, включая S3, Google Cloud Storage, Azure, а также с фреймворками для оркестрации (Airflow, Dagster). Проект имеет открытый исходный код на GitHub, где принимаются issue и pull request’ы.

Источники

  1. Официальная документация dbt-duckdb (GitHub, раздел dbt-labs/dbt-duckdb).
  2. Документация DuckDB (duckdb.org).
  3. Официальная документация dbt (docs.getdbt.com).
  4. Статья «dbt-duckdb: A Lightweight Alternative for Data Transformation» (блог MotherDuck).
  5. Репозиторий проекта на GitHub (github.com/dbt-labs/dbt-duckdb).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →