Jako 偶e zawodowo jestem od zarania dziej贸w Bazylem, nieustannie dziubi臋 w najr贸偶niejszego rodzaju bazach danych. Po drodze wyspecjalizowa艂em si臋 w budowaniu hurtowni danych, co jest o tyle wygodne, 偶e (A) poj臋cie "hurtownia danych" jest bardzo nieostre i ka偶dy projekt jest inny oraz (B) mn贸stwo firm potrzebuje hurtowni danych lub przynajmniej czego艣 wystarczaj膮co podobnego wi臋c (C) zaj臋cia mi nie brakuje no i najwa偶niejsze: (D) nie ma nudy, bo (A).
Hurtownia danych ma dane [citation needed]. Te dane trzeba sk膮dsik zassa膰. Proces owego zasysania wabi si臋 "ETL" czyli z angielskiego "Extract-Transform-Load": najsampierw "Extract", czyli wychachm臋camy dane ze 藕r贸de艂ka, potem "Transform", czyli przekszta艂camy je do bardziej jadalnej postaci, wreszcie "Load" czyli zapisujemy przekszta艂cone dane do hurtowni w艂a艣ciwej.
Ewentualnie ELT: najpierw zaci膮gamy dane ze 藕r贸de艂ka, potem zapisujemy je lokalnie bez 偶adnych zmian i dopiero wtedy grzebiemy z transformacjami.
O ile "E" i "L" s膮 ju偶 od dawna zestandaryzowane i w zasadzie wymagaj膮 minimum wysi艂ku intelektualnego, o tyle "T" bywa skomplikowane. Czasem trzeba tabelk臋 obr贸ci膰 o 90 stopni, czasem powyci膮ga膰 dane z paru tabelek i poskleja膰, albo wr臋cz przeciwnie - wyj膮膰 dane z jakiej艣 kolumny i je pokawa艂kowa膰, czasem rozbebeszy膰 jakiego艣 d偶ejsona czy innego iksemela, do tego jeszcze policzy膰 jak膮艣 艣redni膮 czy inne odchylenie. R贸偶nie.
Owo "T" to do艣膰 cenny kawa艂ek w tej tr贸jcy, bo przekszta艂cenia danych mog膮 by膰 ca艂kiem z艂o偶one, w dodatku w ka偶dym projekcie hurtowni b臋d膮 one inne, raczej unikalne. Wiele projekt贸w hurtowni danych zapada si臋 pod ci臋偶arem zbyt du偶ego i skomplikowanego "T".
G艂贸wny go艣膰 dzisiejszego wpisu, narz臋dzie DBT firmy - uwaga, niespodzianka - DBT Labs pr贸buje ustandardyzowa膰 owo nieszcz臋sne "T" i sprawi膰, 偶eby transformacje by艂y 艂atwe, proste i przyjemne. Do tego jeszcze bierze pod uwag臋 wsp贸艂czesne "zachmurzenie" biznesu, a wi臋c nieobce mu s膮 wszelakie awuesy, azury i inne kubernety - aczkolwiek oczywi艣cie z lokaln膮 instancj膮 MSSQL czy SQLite te偶 zabangla.
Na DBT natkn膮艂em si臋 ca艂kiem przypadkiem, w okolicach pi x drzwi listopada zesz艂ego roku, kiedy to nazwa ta wyp艂yn臋艂a w rozmowie z koleg膮 z innego teamu, kt贸ry z kolei us艂ysza艂 j膮 od klienta przy okazji jakiego艣 tam projektu. Zaintrygowa艂o mnie to, spr贸bowa艂em si臋 przez chwil臋 tym wynalazkiem pobawi膰, ale bez wi臋kszych sukces贸w, bo zawalony robot膮 oraz wydarzaj膮cym si臋 wok贸艂 szeroko poj臋tym 呕yciem po prostu nie mia艂em czasu 偶eby wrzuci膰 sobie na tapet kolejn膮 zabawk臋.
Jednak ca艂kiem niedawno pojawi艂 mi si臋 na s艂u偶bowym p贸艂misku inny projekt, kt贸ry ugrz膮z艂 by艂 w艂a艣nie na etapie budowania przekszta艂ce艅 danych l膮duj膮cych w hurtowni. Przypomnia艂em sobie wtedy o DBT, zasiad艂em do艅 tym razem ju偶 nieco porz膮dniej, przegryz艂em si臋 przez dokumentacj臋 (nie ca艂膮 - na to potrzebowa艂bym z p贸艂 偶ycia) i zabra艂em si臋 za eksperymentowanie.
Efekty?
P贸ki co czuj臋 si臋 troch臋 jak dziesi臋ciolatek, kt贸ry po pi臋ciu lekcjach p艂ywania na lokalnym basenie musi teraz wskoczy膰 do oceanu. Czyli: przy samym brzegu, nie dalej ni偶 do kolan, koniecznie w kamizelce. Pomalutku, na rozpaczliwca, czasem 艣mieszno, czasem straszno - ale jako艣 p艂yn臋 馃檪
Pocz膮tkowo planowa艂em zrobi膰 tutaj szczeg贸艂owy przepis na szarlotk臋 z DBT, ale potem si臋 jak zwykle okaza艂o, 偶e sko艅czy艂 mi si臋 rozp臋d 艂amane przez czas, wi臋c dzi艣 tylko opowiem o narz臋dziu og贸lnie, a bardziej szczeg贸艂owe instrukcje by膰 mo偶e zamieszcz臋 w jakim艣 przysz艂ym wpisie.
Na dzie艅 dobry instalujemy sobie DBT - najlepiej od razu dla takiej technologii bazodanowej, jakiej b臋dziemy u偶ywa膰 w docelowym projekcie. Na stronie producenta jest szczeg贸艂owa lista wszystkich obs艂ugiwanych technologii. W chwili kiedy pisz臋 te s艂owa jest tam 10 wtyczek "oficjalnych" oraz 28 "nieoficjalnych" tj. napisanych przez ludzi spoza firmy, ale zatwierdzonych przez producenta do og贸lnego u偶ytku.
Potem tworzymy sobie folder roboczy i wydajemy w nim magiczn膮 komend臋 dbt init <m贸j projekt>
, kt贸ra utworzy folder o nazwie <m贸j projekt>
, a w nim szereg podfolder贸w do r贸偶nych rzeczy - nas najbardziej b臋dzie interesowa膰 podfolder models
. Zanim jednak zaczniemy zabaw臋 w艂a艣ciw膮 musimy upewni膰 si臋, 偶e mamy porz膮dnie zdefiniowane po艂膮czenia do danych, kt贸re nale偶y skonfigurowa膰 w pliku o nazwie profiles.yml
znajduj膮cym si臋 w ukrytym folderze ~/.dbt
Tylda oznacza tu nasz katalog domowy czyli pod linuksem /home/nazwa_uzytkownika
a w Windows C:\Users\nazwa_uzytkownika
.
Pow贸d, dla kt贸rego plik ten trzymany jest na zewn膮trz naszego projektu jest bardzo prosty: projekt z za艂o偶enia b臋dzie siedzia艂 w jakim艣 GIT-cie, a nie chcemy przecie偶 trzyma膰 tam naszych hase艂 dost臋pu do danych. Mo偶na zmieni膰 lokalizacj臋 tego pliku, ale trzeba wtedy pami臋ta膰 o poinformowaniu DBT stosown膮 opcj膮 w wierszu polece艅.
Zawarto艣膰 / sk艂adnia pliku profiles.yml
zale偶y od tego, do jakiego 藕r贸d艂a danych si臋 艂膮czymy - szczeg贸艂y mo偶na znale藕膰 w oficjalnej dokumentacji. Najlepiej jednak wygugla膰 jaki艣 gotowy, konkretny przyk艂ad, poniewa偶 te pokazane na stronie producenta s膮 zazwyczaj nieco za bardzo szczeg贸艂owe, bo chc膮 zaprezentowa膰 wszystkie mo偶liwe opcje.
Prawd臋 powiedziawszy porz膮dne ustawienie wszystkiego w profiles.yml
by艂o - przynajmniej dla mnie - najtrudniejszym kawa艂kiem do nauczenia si臋. Dalej ju偶 z g贸rki.
W folderze z projektem znajdziemy podfolder models
, w kt贸rym b臋dziemy tworzy膰 pliki .sql
o nazwach odpowiadaj膮cych tabelom docelowym naszej hurtowni, oraz o zawarto艣ci sk艂adaj膮cej si臋 z pojedynczego polecenia SELECT...
poprzedzonego (opcjonalnie) dyrektywami typu klucze sortuj膮ce, indeksy unikalne, strategie aktualizacji danych i tak dalej. DBT b臋dzie potem te nasze SELECT
-y uruchamia膰, a ich wyniki zapisywa膰 do tabeli docelowej.
Na pocz膮tku 艂atwo jest przeoczy膰 jedn膮 rzecz: polecenie SELECT...
w pliku .sql
w folderze models
jest, i owszem, napisane przy u偶yciu sk艂adni SQL w艂a艣ciwej dla konkretnego silnika bazy danych, ale mo偶na w nim u偶ywa膰 dodatkowych - umieszczonych w podw贸jnych nawiasach w膮satych - "magicznych" wyra偶e艅 zgodnych ze sk艂adni膮 DBT, kt贸re wzbogacaj膮 nasz skrypt i daj膮 dodatkowego kopa. Ka偶dorazowe uruchomienie projektu (poleceniem dbt run
) tak naprawd臋 najpierw "kompiluje" te nasze pliki .sql
do folderu target
, a dopiero potem uruchamia te skompilowane wersje.
Opr贸cz tego w folderze models
mo偶na te偶 (i warto!) tworzy膰 pliki .yml
sparowane nazw膮 z plikami .sql
. W tych plikach .yml
(lokalni wymawiaj膮 to "yaml") definiujemy dokumentacj臋 poszczeg贸lnych kolumn (typy danych, opisy itd), rozmaite testy, jakie DBT ma uruchamia膰 na naszych danych, na przyk艂ad unikalno艣膰 kluczy, NULL-e, ale te偶 mn贸stwo innych, bardziej zaawansowanych (na przyk艂ad mo偶na sobie utworzy膰 test, kt贸ry przejdzie je偶eli odsetek NULL-i w jakiej艣 kolumnie jest mniejszy ni偶 x%) i kup臋 innego 艣miecia.
Na osobn膮 uwag臋 zas艂uguje funkcja {{ ref('...') }}
, kt贸ra najcz臋艣ciej trafia zaraz po FROM
ewentualnie JOIN
, a kt贸ra definiuje zale偶no艣ci mi臋dzy danymi. Na przyk艂ad zamiast pisa膰 SELECT * FROM edw.tabela
piszemy SELECT * FROM {{ ref('tabela') }}
dzi臋ki czemu DBT "rozumie", 偶e kod zapisuj膮cy dane do edw.tabela
musi zosta膰 uruchomiony najpierw. Ponadto je偶eli zmieni nam si臋 schema
docelowa (w tym przypadku: edw
) to zmian臋 t臋 wykonujemy tylko w jednym miejscu (plik konfiguracyjny projektu) i od tej pory DBT automagicznie b臋dzie wo艂a膰 t臋 tabel臋 z w艂a艣ciwego miejsca.
Jeszcze innym wa偶nym elementem DBT s膮 strategie aktualizacji danych. Nie uda艂o mi si臋 p贸ki co przetestowa膰 wszystkich, te najwa偶niejsze to:
table
- kasuje i tworzy ca艂膮 tabel臋 docelow膮 od zera za ka偶dym razem.incremental
- dopisuje nowe dane i aktualizuje zmienione rekordy w oparciu o klucze i inne metadane.ephemeral
- tworzy "wirtualn膮" tabel臋 na potrzeby bie偶膮cej sesji, kt贸ra nie jest nigdzie materializowana w bazie danych, ale mo偶na jej u偶ywa膰 w projekcie. Co艣 jakby CTE tylko na poziomie samego narz臋dzia.view
- tworzy w bazie docelowej widok zamiast tabeli.
Te strategie r贸wnie偶 definiuje si臋 w pliku konfiguracyjnym projektu, ale mo偶na je potem nadpisywa膰 w konfiguracji poszczeg贸lnych tabel (czyli na przyk艂ad ustawiamy ca艂y projekt na incremental
a potem je偶eli chcemy jak膮艣 konkretn膮 tabel臋 mie膰 w modelu table
, ustawiamy to w konfiguracji tej jednej tabeli).
Prawdziwym hitem jest komenda dbt docs
, kt贸ra - w zale偶no艣ci od wybranej opcji - generuje b膮d藕 serwuje w postaci lokalnego serwera www - pe艂n膮 dokumentacj臋 naszego projektu, a wi臋c wszystkie elementy, kt贸re mamy w naszym projekcie, w艂膮czaj膮c w to wykresy zale偶no艣ci mi臋dzy tabelami. Najpro艣ciej wyda膰 komend臋 dbt docs serve --port xyz
(gdzie xyz to numer portu TCP, na kt贸rym b臋dzie mo偶na ogl膮da膰 dokumentacj臋) - a nast臋pnie w przegl膮darce wej艣膰 na localhost:xyz
i podziwia膰. Mo偶na zamiast tego zrobi膰 dbt docs generate
, kt贸ra wyprodukuje statyczn膮 stron臋 www w folderze target
(nie jest to tak wygodne jak dbt docs serve
, ale dzia艂a).
Innym bardzo po偶ytecznym poleceniem jest komenda dbt test
, kt贸ra nie modyfikuje 偶adnych danych, ale uruchamia wszystkie testy, jakie zdefiniowali艣my w naszym projekcie i wyrzuca na wyj艣ciu szczeg贸艂owy raport. Dzi臋ki temu mo偶emy na przyk艂ad wy艂apa膰 niezgodno艣ci mi臋dzy naszym projektem a faktyczn膮 struktur膮 danych w bazie, b艂臋dy w sk艂adni SQL-a i kup臋 innych rzeczy.
Zar贸wno dbt test
jak i dbt run
akceptuj膮 opcj臋 --select
po kt贸rej podajemy nazw臋 tabeli - w takim przypadku narz臋dzie uruchomi przetwarzanie (lub testowanie) wy艂膮cznie dla tej jednej tabeli. Jest to przydatne zw艂aszcza przy du偶ych projektach, gdzie ka偶dorazowe przetwarzanie ca艂o艣ci mog艂oby zaj膮膰 zbyt wiele czasu (i / lub zasob贸w).
Na razie bawi臋 si臋 tym narz臋dziem dopiero od mniej wi臋cej tygodnia, ale ju偶 widz臋 mn贸stwo interesuj膮cych zastosowa艅. Najlepsze jest to, 偶e tak naprawd臋 przekazujemy "w艂adz臋" je偶eli chodzi o pisanie zapyta艅 analitycznych w r臋ce "ludu" (czyli analityk贸w) - ka偶dy u偶ytkownik znaj膮cy SQL mo偶e sobie tworzy膰 swoje pliki z zapytaniami do hurtowni i po chwili dosta膰 wynik - w postaci nowej tabeli lub widoku - a co najwa偶niejsze wszystko to siedzi sobie 艂adnie w systemie kontroli wersji wi臋c jak kto艣 co艣 spieprzy, od razu wiadomo kto, co i kiedy 馃檪
Troch臋 mi ten wpis wyszed艂 chaotyczny, ale to pewnie dlatego, 偶e pr贸buj臋 tutaj opisa膰 wszystko na raz, na wariata. Je偶eli czas i samozaparcie pozwol膮, nie wykluczam osobnej, bardziej uporz膮dkowanej serii wpis贸w o DBT. P贸ki co - zach臋cam do samodzielnego eksperymentowania z tym narz臋dziem. Zapewniam - warto.
Je偶eli chcesz do komentarza wstawi膰 kod, u偶yj sk艂adni:
[code]
tutaj wstaw sw贸j kod
[/code]
Je偶eli zrobisz liter贸wk臋 lub zmienisz zdanie, mo偶esz edytowa膰 komentarz po jego zatwierdzeniu.