Transform av data i Snowflake med hjälp av dbt

dbt är ett verktyg för transformation av data och inkluderar även möjligheten till automatiska tester, hantera schemaläggning/monitorering av jobb, skapa dokumentation m.m. I detta inlägg kommer vi att utgå från det som kallas dbt Cloud vilket är webbgränssnittet för dbt, det finns även dbt CLI (command-line interface). För en ovan användare är oftast dbt Cloud enklare att komma igång med, de tillgängliga funktionerna skiljer sig något mellan de olika verktygen.


dbt abstraherar transformeringen av data i Snowflake och istället för att skriva transformerna direkt i Snowflake skrivs de i dbt. dbt kan användas tillsammans med flera olika DW:s och databaser, några exempel visas nedan.

Ett projekt i dbt innehåller alltid en projekt-fil (.yml) och flera modell-filer (.sql).

Projektfilen innehåller generell konfiguration medans modell-filerna innehåller själva transformationerna. En enkel transformation skulle kunna vara att vi vill slå ihop orderhuvudtabellen med orderradstabellen till en tabell innehållande alla kundordrar. I detta exempel kommer vi utgå från två tabeller, order och orderrow, enligt nedan i Snowflake. Dessa speglar rådatan i källsystemet och ligger i schemat "RAW". I exemplet nedan har vi bara en rad i respektive tabell.

Bild 1. Order-tabellen i Snowflake


Bild 2. Orderrow-tabellen i Snowflake


Transform i dbt

I dbt har vi tre modellfiller, två som avser rådatatabellerna och en som avser sluttabellen. Vi väljer att skapa en mapp som heter staging och att döpa modellfilerna här med prefixet ”stg_” för att tydligt visa att detta endast är tvättad data och inte avsedd för andra system att direkt konsumera. Vi skapar en mapp som heter marts där våra slutprodukter finns.

Bild 3. stg_order.sql i dbt

Här läser vi från en tabell som heter ”order” som innehåller rådata. I detta inlägg kommer vi inte i detalj att gå igenom hur kopplingen mot Snowflake är uppsatt men genom schema.yml-filen så kan vi referera till vår rådata i Snowflake genom att använda oss av source()-funktionen. Vi gör några enkla transformer i form av att vi döper om ett av fälten och justerar formatering av ett fält som innehåller orderdatum som i källsystemet har formatet YYYYMMDD till att bli ett datumfält i Snowflake.

Bild 4. stg_orderrow.sql i dbt

Här läser vi från en tabell som heter ”orderrow” som innehåller rådata. Vi gör några enkla transformer i form av att vi döper om två av fälten.

Bild 5. customerorders.sql i dbt

Här slår vi samman de två tabellerna till en ny tabell som vi kallar ”customerorders”. Vi refererar till andra modellfiler genom att använda oss av ref()-funktionen. Vi vill att våra sluttabeller skapas upp i ett schema i databasen som heter ”consume”, vilket vi anger högst upp i filen.


Kollar vi hur resultatet blir i Snowflake ser det ut enligt nedan, det vill säga vi har skapat upp en ny tabell i schemat ”consume” där tanken är att slutsystemen kan konsumera data.

Bild 6. customerorders i Snowflake

Versionshantering är enkelt via dbt så när vi är klara med våra transformeringar checkar vi enkelt in våra ändringar till exempelvis GitHub eller GitLab. dbt erbjuder även Lineage vilket tydligt visar relationerna mellan våra modeller.

Bild 7. Lineage i dbt

Nu har vi extraherat data från källsystemet och transformerat den efter behov, så nu återstår att konsumera datat i Qlik Sense. Mer om detta i nästa avsnitt!


 

Skriven av: Erik Johansson

Erik Johansson är Business Intelligence-konsult och har erfarenhet från kunder inom retail och produktion. Erik arbetar bland annat med Qlik och Snowflake samt har även tidigare erfarenhet från integrationsutveckling. LinkedIn