В нас вже була добірка статей про цей чудовий інстремент для роботи з даними, а саме для їх обробки (Transform).
🔗Що таке dbt і навіщо він потрібен маркетинг-аналітику
🔗Що насправді робить dbt?
Але технології не стоять на ринку і Олег Агапов вирішив додати більш оновлену та актуальну інформацію про DBT.
Структура dbt проекта
В оригінальній статті автор розглядає організацію свого проекту на прикладі структури тек. У світі dbt насправді немає жорстких правил щодо того, які директорії слід створювати і які моделі в них зберігати. Проте є чудова стаття від розробників dbt, де вони пропонують свою структуру та пояснюють, чому її можна вважати найкращою практикою. Стаття має назву “How we structure our dbt projects“.
Принцип структури наступний. Ми маємо три базові директорії:
- staging – для відображення сирих даних
- intermediate – для проміжних моделей, які нецікаві кінцевому споживачу, а тількі корисні для побудови фінальних моделей
- marts – для дата мартів, тобто для фінальних моделей
Кожна директорія відображає також шар данних, тобто входні, проміжн та фінальні моделі відповідно. Кожен шар може мати свої налаштування і використовується лише за своїм призначенням. Таким чином, якщо дві різні команди будуть використовувати таку саму структуру, то нова людина швидко розбереться що до чого.
Насправді можуть бути і інші шари, в статті теж про це говориться.
Jinja
Jinja це такий шаблонізатор, який дозволяє писати мета-код, тобто код, який на етапі компіляції перетвориться в нормальний SQL код. Ось вам трошки розширений приклад із статті.
Припустимо у вас є наступний код:
SELECT
SUM(CASE
WHEN transaction_method = 'credit_cart'
THEN amount
END) as credit_card_amount,
SUM(CASE
WHEN transaction_method = 'bank'
THEN amount
END) as bank_amount,
SUM(CASE
WHEN transaction_method = 'paypal'
THEN amount
END) as paypal_amount
FROM transactions
Як ви бачете в цьому коді багато повтореннь. А уявіть приклад, коли таких повтореннь може бути десятки. Це ж і насправді жах це все підтримувати, читати та розбиратися. А ось як цей код можна спростити за допомогою Jinja:
SELECT
{% for method in ['credit_cart', 'bank', 'paypal'] %}
SUM(CASE
WHEN transaction_method = '{{ method }}'
THEN amount
END) as {{ method }}_amount,
{% endfor %}
FROM transactions
Бачите як той самий код значно коротший? А ще він дозволяє додавати нові значення без копі-пасти існуючого коду!
А як цей код буде виконуватися у сховищі, якщо воно розуміє тільки SQL, а не Jinja? Саме для цього dbt спочатку компілює його у звичайний SQL (як у першому прикладі), а вже потім виконує в базі даних. І все це відбувається автоматично — вам не потрібно нічого спеціально робити, це вже вбудовано в процес!
dbt Cloud
Наступна річ, про яку варто поговорити, — це dbt Cloud, платна версія dbt.
По-перше, компанія, яка створює dbt, більше не називається Fishtown Analytics — тепер вони dbt Labs.
По-друге, зараз там існує набагато більше функціоналу, ніж просто запуск проектів за розкладом. Там є Cloud IDE — повноцінне середовище розробки проекту у браузері, підтримка CI/CD для dbt проектів, онлайн документація dbt Explorer (а також її попередня версія dbt docs). Коротше кажучи, там тепер набагато більше можливостей.
І останнє — ціна. Платна версія тепер коштує $100 на місяць за розробника у базовій версії. Є ще Enterprise версія для великих клієнтів. Кажуть, що там ціни втричі вищі за базовий тариф.
Документація
Для кожної таблиці та її полів можна додавати документацію.
Це все ще здійснюється через додавання спеціального YAML-файлу з описом того, що ви хочете задокументувати.
Хочу виправити одну деталь з оригінальної статті. Ця документація не з’являється автоматично у сховищі (як на прикладі з BigQuery). Для цього треба задати спеціальний параметр persist_docs. Саме це налаштування уможливлює додавання документації до таблиць та полів у базі даних.
Тестування
В оригінальній статті автор згадує тестування моделей за допомогою тестів у YAML-конфігурації або написання кастомних запитів на SQL. Ця інформація все ще актуальна, окрім того факту, що назва “test” змінилася на “data_tests” у версії 1.8.
Але з’явилось дещо нове — юніт-тестування.
Юніт-тест — це коли ми хочемо протестувати не самі дані, які зберігаються у сховищі, а логіку SQL. Тобто є випадки, коли нам не потрібні реальні дані, щоб зрозуміти, що логіка моделі працює правильно.
Наприклад, у вас є модель, яка робить комплексну агрегацію, математичні обчислення, CASE WHEN логіку та ще багато чого. Запускати таку модель на реальних даних може коштувати дуже дорого, і якщо є помилка, то дані будуть неправильні. Замість цього можна створити юніт-тест. Він працює наступним чином.
Для кожної моделі треба підібрати вхідні дані (що буде надходити до моделі) та змоделювати вихідні (що ви очікуєте на виході). Юніт-тест запустить обчислення моделі на ваших вхідних даних, а потім порівняє результат із тим, що ви очікували отримати (ваші вихідні дані). Якщо дані співпадуть, то ваша логіка SQL працює, і ви можете запускати модель на реальних даних.
Як почати вчити dbt
Наразі існує багато матеріалів про dbt як для початківців, так і для досвідчених користувачів. Я наведу кілька прикладів того, як можна почати вивчати dbt.
Почніть із безкоштовних офіційних курсів від самих dbt Labs. Можна починати з курсу “dbt Fundamentals”, який надасть вам потрібну базу для того, щоб розпочати працювати із фреймворком без проблем. Потім ви вже можете обирати те, куди ви хотіли б заглибитись. Наприклад, далі можна вивчати Jinja, просунуте тестування або рефакторинг SQL-коду.
Також є чимало платних курсів. Я можу особисто рекомендувати два курси від Uplimit: “Analytics Engineering with dbt” та “Advanced dbt”. Я був на обох курсах як студент і як асистент викладача. Матеріал дуже якісний, а проекти для тренувань — надзвичайно корисні.
Наостанок розповім про свій ньюзлетер dbtips. Там я намагаюсь збирати поради, які сам використовував у реальних проектах. Також іноді пишу повноцінні туторіали.
На жаль, усі матеріали англійською, тому треба докласти трохи зусиль, щоб опрацювати їх. Але вони того варті.
🚀Долучайтесь до нашої спільноти Telegram:
🚀Долучайтесь до нашої спільноти FaceBook:
🚀Долучайтесь до нашої спільноти Twiter X: