Тепер засукаймо рукави й почнімо працювати з dbt разом.
Серія статей:
- Частина 1 — пролог
- Спробуймо dbt. Частина 2 — перший запуск
- Частина 3 — seed і source
- Частина 4 — матеріалізація моделей
- Частина 5 — від Jinja до макросів і хуків
- Частина 6 — знімки та аналізи
- Частина 7 — тести
- Частина 8 — DAG і документація
- Частина 9 — змінні
- Частина 10 — пакети
- Частина 11 — SQLFluff і Pre-Commit
Встановлення
Насамперед потрібно встановити dbt. dbt має бути встановлений у Python-середовищі, тож зробити це можна через uv або pip.
Ми встановлюємо бібліотеки dbt-core і dbt-<adapter>, де <adapter> — це сховище даних, з яким працюватимемо. Тут я використовую адаптер dbt-bigquery.
Докладніше про адаптери: Supported data platforms | dbt Developer Hub
Гаразд, встановлюємо.
Варіант із uv:
# синтаксис
uv add dbt-core dbt-<adapter>
# приклад
uv add dbt-core dbt-bigqueryПро uv автор писав в окремій статті: Let’s try: uv for faster Python packages
Варіант із pip:
# синтаксис
pip install dbt-core dbt-<adapter>
# приклад
pip install dbt-core dbt-bigqueryТепер команди dbt доступні. Перевіримо версії, щоб переконатися, що встановлення завершилось успішно:
$ dbt --version
Core:
- installed: 1.10.13
- latest: 1.10.13 - Up to date!
Plugins:
- bigquery: 1.10.2 - Up to date!Ініціалізація
Наступний крок — ініціалізувати проєкт такою командою:
dbt initЗ’являться підказки для налаштування нашого dbt-проєкту. Наведений приклад стосується BigQuery і може відрізнятися, якщо ви використовуєте інші адаптери.
19:33:36 Running with dbt=1.10.13
Enter a name for your project (letters, digits, underscore): dbt_proj01
19:33:42
Your new dbt project "dbt_proj01" was created!
For more information on how to configure the profiles.yml file,
please consult the dbt documentation here:
https://docs.getdbt.com/docs/configure-your-profile
One more thing:
Need help? Don't hesitate to reach out to us via GitHub issues or on Slack:
https://community.getdbt.com/
Happy modeling!
19:33:42 Setting up your profile.
Which database would you like to use?
[1] bigquery
(Don't see the one you want? https://docs.getdbt.com/docs/available-adapters)
Enter a number: 1
[1] oauth
[2] service_account
Desired authentication method option (enter a number): 1
project (GCP project id): <project>
dataset (the name of your dbt dataset): <dataset>
threads (1 or more): 1
job_execution_timeout_seconds [300]:
[1] US
[2] EU
Desired location option (enter a number): 2
19:34:45 Profile dbt_proj01 written to ~/.dbt/profiles.yml using target's profile_template.yml and your supplied values. Run 'dbt debug' to validate the connection.💡Як видно з останнього рядка, файл
profiles.ymlза замовчуванням лежить у каталозі~/.dbt/. Ми можемо скопіювати його до каталогу проєкту, щоб краще впорядкувати файли.
Відповідно до моїх відповідей на підказки, я назвав проєкт dbt_proj01 і обрав bigquery як адаптер. Тож dbt_proj01 — це тепер назва мого dbt-каталогу.
І ми маємо побачити згенеровану структуру файлів приблизно таку:
.
├── dbt_proj01
│ ├── README.md
│ ├── analyses
│ ├── dbt_project.yml
│ ├── macros
│ ├── models
│ │ └── example
│ │ ├── my_first_dbt_model.sql
│ │ ├── my_second_dbt_model.sql
│ │ └── schema.yml
│ ├── profiles.yml # необов'язково, скопійовано з `~/.dbt/profiles.yml`
│ ├── seeds
│ ├── snapshots
│ └── tests
└── logs
└── dbt.logОсь типовий вміст файлів dbt_project.yml і profiles.yml.
dbt_project.yml:
# Назвіть свій проєкт! Назви проєктів мають містити лише малі літери
# та підкреслення. Гарна назва пакета відображає назву вашої
# організації або призначення цих моделей
name: 'dbt_proj01'
version: '1.0.0'
# Цей параметр визначає, який "profile" dbt використовує для цього проєкту.
profile: 'dbt_proj01'
# Ці налаштування вказують, де dbt має шукати різні типи файлів.
# Наприклад, параметр `model-paths` вказує, що моделі цього проєкту
# розташовані в каталозі "models/". Найімовірніше, змінювати їх не доведеться!
model-paths: ["models"]
analysis-paths: ["analyses"]
test-paths: ["tests"]
seed-paths: ["seeds"]
macro-paths: ["macros"]
snapshot-paths: ["snapshots"]
clean-targets: # каталоги, які буде видалено командою `dbt clean`
- "target"
- "dbt_packages"
# Налаштування моделей
# Повна документація: https://docs.getdbt.com/docs/configuring-models
# У цьому прикладі конфігурації ми вказуємо dbt будувати всі моделі
# з каталогу example/ як view. Ці налаштування можна перевизначити
# в окремих файлах моделей за допомогою макроса `{{ config(...) }}`.
models:
dbt_proj01:
# Конфігурація, позначена через +, застосовується до всіх файлів у models/example/
example:
+materialized: viewprofiles.yml:
dbt_proj01:
outputs:
dev:
dataset: <dataset>
job_execution_timeout_seconds: 300
job_retries: 1
location: EU
method: oauth
priority: interactive
project: <project>
threads: 1
type: bigquery
target: devПеревірка (debug)
Після ініціалізації варто (і слід завжди) перевірити, чи правильні конфігурація та підключення.
# переходимо в каталог проєкту
cd dbt_proj01
dbt debugНаприкінці ми маємо побачити All checks passed.
19:45:27 Running with dbt=1.10.13
19:45:27 dbt version: 1.10.13
19:45:27 python version: 3.11.13
19:45:27 python path: ...
19:45:27 os info: ...
19:45:28 Using profiles dir at ...
19:45:28 Using profiles.yml file at ...
19:45:28 Using dbt_project.yml file at .../dbt_project.yml
19:45:28 adapter type: bigquery
19:45:28 adapter version: 1.10.2
19:45:28 Configuration:
19:45:28 profiles.yml file [OK found and valid]
19:45:28 dbt_project.yml file [OK found and valid]
19:45:28 Required dependencies:
19:45:28 - git [OK found]
19:45:28 Connection:
19:45:28 method: oauth
...
19:45:31 Connection test: [OK connection ok]
19:45:31 All checks passed!Моделі
Ініціалізацію виконано. Перевірку виконано. Тепер погляньмо, які моделі створюються за замовчуванням.
Усі моделі лежать у каталозі models/.
.
└── dbt_proj01
└── models
└── example
├── my_first_dbt_model.sql
├── my_second_dbt_model.sql
└── schema.ymlmy_first_dbt_model.sql матеріалізується як таблиця з одним стовпцем id і двома записами.
/*
Вітаємо у вашій першій dbt-моделі!
Чи знали ви, що моделі також можна налаштовувати безпосередньо у SQL-файлах?
Це перевизначить налаштування, зазначені у dbt_project.yml.
Спробуйте змінити "table" на "view" нижче.
*/
{{ config(materialized='table') }}
with source_data as (
select 1 as id
union all
select null as id
)
select *
from source_data
/*
Розкоментуйте рядок нижче, щоб видалити записи зі значеннями `id`, що дорівнюють NULL.
*/
-- where id is not nullmy_second_dbt_model.sql матеріалізується як view, що робить вибірку з my_first_dbt_model, де id дорівнює 1.
-- Використовуй функцію `ref` щоб обрати з іншої моделі
select *
from {{ ref('my_first_dbt_model') }}
where id = 1А schema.yml — це опис наших моделей. Тут можна задати описи, визначення стовпців і тести даних.
version: 2
models:
- name: my_first_dbt_model
description: "A starter dbt model"
columns:
- name: id
description: "The primary key for this table"
data_tests:
- unique
- not_null
- name: my_second_dbt_model
description: "A starter dbt model"
columns:
- name: id
description: "The primary key for this table"
data_tests:
- unique
- not_nullКомпіляція
Моделі написані на SQL і Jinja. Ми можемо скомпілювати їх, щоб побачити підсумкові запити:
# переходимо в каталог проєкту
cd dbt_proj01
dbt compileІ маємо побачити повідомлення, яке підтверджує, що всі моделі опрацьовано без помилок.
19:34:42 Running with dbt=1.10.13
19:34:43 Registered adapter: bigquery=1.10.2
19:34:43 Found 2 models, 4 data tests, 508 macros
19:34:43
19:34:43 Concurrency: 1 threads (target='dev')Усі скомпільовані моделі зберігаються в каталозі target/compiled/<project_name>/models/. Погляньмо, що всередині.
target/compiled
└── dbt_proj01
└── models
└── example
├── my_first_dbt_model.sql
├── my_second_dbt_model.sql
└── schema.yml
├── not_null_my_first_dbt_model_id.sql
├── not_null_my_second_dbt_model_id.sql
├── unique_my_first_dbt_model_id.sql
└── unique_my_second_dbt_model_id.sqlСкомпільований my_first_dbt_model.sql:
/*
Вітаємо у вашій першій dbt-моделі!
Чи знали ви, що моделі також можна налаштовувати безпосередньо у SQL-файлах?
Це перевизначить налаштування, зазначені у dbt_project.yml.
Спробуйте змінити "table" на "view" нижче.
*/
with source_data as (
select 1 as id
union all
select null as id
)
select *
from source_data
/*
Розкоментуйте рядок нижче, щоб видалити записи зі значеннями `id`, що дорівнюють NULL.
*/
-- where id is not nullСкомпільований my_second_dbt_model.sql:
-- Використовуйте функцію `ref`, щоб вибирати дані з інших моделей
select * from `<project>`.`<dataset>`.`my_first_dbt_model` where id = 1Ці скомпільовані запити вже можна виконувати по-справжньому.
Запуск
Компіляцію можна виконати заздалегідь або ні — ця команда компілює й запускає всі моделі, після чого створює таблиці та view у реальному середовищі.
# переходимо в каталог проєкту
cd dbt_proj01
dbt run20:07:24 Running with dbt=1.10.13
20:07:26 Registered adapter: bigquery=1.10.2
20:07:26 Unable to do partial parsing because saved manifest not found. Starting full parse.
20:07:26 Found 2 models, 4 data tests, 508 macros
20:07:26
20:07:26 Concurrency: 1 threads (target='dev')
20:07:26
20:07:31 1 of 2 START sql table model dbt_test_dataset.my_first_dbt_model ............... [RUN]
20:07:35 1 of 2 OK created sql table model dbt_test_dataset.my_first_dbt_model .......... [CREATE TABLE (2.0 rows, 0 processed) in 3.61s]
20:07:35 2 of 2 START sql view model dbt_test_dataset.my_second_dbt_model ............... [RUN]
20:07:36 2 of 2 OK created sql view model dbt_test_dataset.my_second_dbt_model .......... [CREATE VIEW (0 processed) in 1.61s]
20:07:36
20:07:36 Finished running 1 table model, 1 view model in 0 hours 0 minutes and 9.99 seconds (9.99s).
20:07:36
20:07:36 Completed successfully
20:07:36
20:07:36 Done. PASS=2 WARN=0 ERROR=0 SKIP=0 NO-OP=0 TOTAL=2Лог каже, що все гаразд. Якщо перевірити в BigQuery, ми маємо побачити нові таблиці та view, створені щойно запущеними моделями.
Як бачимо, назви моделей використано як назви таблиць і view.
Підсумок
Зберімо докупи всі команди, які ми виконали.
# встановлення dbt
uv add dbt-core dbt-<adapter>
pip install dbt-core dbt-<adapter>
dbt init # ініціалізація
dbt debug # перевірка
dbt compile # побудова підсумкових запитів
dbt run # створення реальних таблиць і viewДжерела
- Supported data platforms | dbt Developer Hub
- About dbt init command | dbt Developer Hub
- About dbt debug command | dbt Developer Hub
- About dbt compile command | dbt Developer Hub
- About dbt run command | dbt Developer Hub
ОРИГІНАЛ СТАТТІ: Let’s try: dbt part 2 – first start
АВТОР СТАТТІ: bluebirz
Оригінал опубліковано під ліцензією CC BY 4.0. Цей матеріал є перекладом українською мовою.
Доєднуйтесь до наших спільнот 👇
