V Dbt (data build tools) jsou soubory organizovány v logické struktuře. Abychom se v projektu dlouhodobě vyznali při rostoucím množství kódu, je vhodné si v souborech udělat určitý systém.
Souborová struktura dbt projektu
Po inicializaci prázdného dbt dostaneme adresářovou strukturu viz níže. Root je náš dbt projekt. Uvnitř najdeme konfigurační soubory dbt_project.yml a dbt_profiles.yml a dále několik adresářů.
my_dbt_project/ |-- dbt_project.yml |-- dbt_profiles.yml |-- models/ | |-- example/ | | |-- my_first_dbt_model.sql | | |-- my_second_dbt_model.sql |-- analysis/ |-- macros/ |-- snapshots/ |-- tests/
Ze začátku nás zajímají zejména 2 adresáře – models a snapshots.
Dbt Models a snapshot adresáře a organizace
Do složek models asnapshots umisťujeme sql skripty, které se následně materializují do naší cílové destinace (target). Cílové prostředí (dev) a (prod) je nastaveno v konfiguračním souboru profiles.yml.
Ze začátku budeme mít skriptů asi jen pár, ale časem jich můžeme mít desítky, stovky nebo víc. Best practise tedy je, vytvořit si nějakou smysluplnou logickou strukturu. Já používám tuto viz níže nebo se můžete na strukturu podívat na Github kde mám veřejný dbt projekt.
my_dbt_project/ |-- dbt_project.yml |-- models/ | |-- datamarts/ | | |-- datamart1/ | | | |-- Dim_Table1.sql | | | |-- Fact_Table2.sql | | |-- datamart2/ | | | |-- Dim_Table1.sql | | | |-- Fact_Table2.sql | |-- staging/ | | |-- curr_source_system_1_tablename1.sql | | |-- curr_source_system_1_tablename2.sql | | |-- hist_source_system_1_tablename1.sql | | |-- hist_source_system_1_tablename2.sql |-- analysis/ | |-- Analysis_purpose1/ | | |-- analysis1.sql | | |-- analysis2.sql |-- macros/ | |-- my_macro.sql |-- snapshots/ | |-- source_system_1/ | | |-- snap_source_system_1_tablename1.sql | | |-- snap_source_system_1_tablename2.sql | |-- source_system_2/ | | |-- snap_source_system_2_tablename1.sql | | |-- snap_source_system_2_tablename2.sql |-- tests/ | |-- datamart1/ | | |-- test1.sql | | |-- test2.sql | |-- datamart2/ | | |-- test1.sql | | |-- test2.sql | |-- source_system_1/ | | |-- source_system_1_test1.sql | | |-- source_system_1_test2.sql | |-- source_system_2/ | | |-- source_system_2_test1.sql | | |-- source_system_2_test2.sql
Nastavení schémat dbt_project.yml
Struktura viz výše se hodí do prostředí datových skladů/ datamartů. Každý adresář v Models reprezentuje schéma databáze s tím, že tabulky z adresáře snapshot jsou přesměrovány do schématu staging v adresáři models. To se nastavuje v souboru dbt_project.yml.
models: dbt_project: staging: +materialized: table +schema: staging datamarts: datamart1: +materialized: table +schema: datamart1 datamart2: +materialized: table +schema: datamart2
Tímto zápisem říkáme, že pokud dbt při zpracování najde nějaký skript
- ve složce model/staging tak skripty materializuje jako tabulku do schématu staging
- ve složce datamarts/datamart1 tak obsah materializuje do schématu datamart1
- ve složce datamarts/datamart2 tak obsah materializuje do schématu datamart2
Pokud schémata neexistují, tak si je v cílovém prostředí vytvoří, k tomu by měl být nastaven v souboru profiles.yml dbt_user s patřičnou úrovní oprávnění.