Waarom Python inzetten voor je ETL proces en datawarehouse?
Als de titel van deze blogpost je aandacht heeft getrokken, dan gok ik dat je in je dagelijkse leven te maken hebt met business intelligence of data engineering en dat je op enige manier bekend bent met Python.
Misschien heb je ervaring met programmeren, of heb je er iets over gehoord of gelezen.
Ongeacht je ervaring met Python, in deze post zullen we je laten zien waarom Python een plekje in je ETL proces en datawarehouse verdient en welke methode het beste past in jouw situatie.
Dus:
- wil je weten waarom je nou juist Python moet gebruiken en niet een andere programmeertaal voor je ETL proces?
- zoek je een manier om wat flexibiliteit toe te voegen aan je bestaande datawarehouse? Of ga je van start met het opzetten van een geheel nieuwe oplossing?
- en hebben jij of de mensen in je team enige affiniteit met code schrijven?
Lees dan vooral verder en leer de 3 beste manieren om te beginnen met Python in je ETL proces.
Wat maakt Python zo bijzonder? Waarom niet een andere programmeertaal?
Python is wereldwijd in 2022 een van de meest gebruikte programmeertalen door zowel professionele als startende ontwikkelaars.
Volgens de Stack Overflow Developer Survey van 2022 staat Python – samen met SQL – in de top 4 van meest gebruikte programmeertalen. Als je alleen naar beginners kijkt die een nieuwe taal willen leren, staat het zelfs in de top 3.
Python binnen de data-industrie
Interview Query deed onderzoek naar de meest gevraagde vaardigheden tijdens Data Engineering interviews onder 450+ bedrijven in Amerika.
Wat bleek?
De meest gevraagde vaardigheden zijn SQL, Python en Algoritmes.
Bron: Interview Query | The 2021 Data Science Interview Report
Het mag dus duidelijk zijn dat Python een taal is die breed gedragen wordt binnen de data-industrie en alleen maar verder zal groeien in de komende jaren.
Het grote voordeel van Python: een grote community
Naast het feit dat het door veel mensen gebruikt wordt, bestaat er ook een grote community rondom Python.
Dit heeft als groot voordeel dat er veel over geschreven wordt op populaire forums zoals Stack Overflow en dat er veel open source code (libraries) wordt gedeeld.
Bekijk bijvoorbeeld PyPI · The Python Package Index maar eens. Momenteel worden er 400.000+ projecten gedeeld via de PyPI website.
Binnen data engineering zijn bijvoorbeeld Numpy en Pandas twee hele populaire libraries voor het werken met data. Daarnaast zijn er nog vele andere libraries die door o.a. data scientists worden gebruikt.
Dus zit je met een uitdaging die je wilt oplossen met Python? Grote kans dat iemand het al voor je heeft opgelost en dat je zijn code of aanpak kan hergebruiken. Maak daar slim gebruik van!
Nog een voordeel van Python: geen vendor lock-in
Nog een goede reden om Python te verkiezen boven een standaard ETL tool: je hebt geen last van vendor lock-in.
Omdat de Python community zo groot is en door veel platformen en leveranciers wordt ondersteund, zijn de oplossingen die je ontwikkelt in Python in grote mate herbruikbaar mocht je ooit van platform wisselen.
Je bent daarom beter in staat om in de toekomst van platform of leverancier te wisselen.
Zijn er dan geen nadelen?
We hebben tot nu alleen voordelen opgenoemd, maar zijn er dan geen nadelen?
Jawel, in vergelijking tot andere programmeertalen is Python over het algemeen wat langzamer met het uitvoeren van code. Dit is echter alleen een probleem als performance een grote vereiste van je softwareproject is. Dit soort eisen zie je meestal alleen bij kritische bedrijfsprocessen (denk aan transactionele software), maar niet bij ETL processen die vaak uren kunnen draaien.
Daarnaast vraagt het gebruiken van een programmeertaal in je ETL proces om hele andere vaardigheden van je team, maar dit geldt eigenlijk voor alle programmeertalen.
Als je team tot nu toe gewend is om met pure visuele ETL tools te werken waarmee je een ETL pipeline zo in elkaar klikt, dan is het introduceren van een programmeertaal nog wel een aandachtspunt.
Een ontwikkelaar moet zich comfortabel voelen bij het schrijven van code in plaats van het klikken op een canvas. Daarbij heb je ook iets andere vaardigheden nodig bij het uitrollen en onderhouden van je ETL oplossingen.
Toch ben ik ervan overtuigd dat voor engineers die geïnteresseerd zijn in nieuwe ontwikkelingen en technisch vaardig zijn dit geen obstakel hoeft te vormen.
Er zijn ontelbare cursussen en tutorials online te vinden over hoe je met Python moet werken en met een lage instapdrempel heb je zo je eerste Python script gemaakt.
Zijn er naast Python geen andere geschikte programmeertalen dan?
Je zult je misschien afvragen: Zijn er naast Python nog andere opties voor mijn ETL proces of datawarehouse?
Jawel, die zijn er. Als je kijkt in de lijst van Stack Overflow naar andere veelgebruikte programmeertalen, dan kun je wellicht nog denken aan Java of C# (.NET). Echter, deze talen zijn veel meer toegespitst op softwareontwikkeling en kennen een veel hogere instapdrempel.
Dit merk je bijvoorbeeld aan de extra tijd die nodig is om je .NET of Java ontwikkel- en productieomgeving op te tuigen in vergelijking met die van Python. Daarnaast is de syntax van Python wat minder wollig en toegankelijker dan die van C# en Java.
Het zijn allemaal prima programmeertalen, maar ze lenen zich minder goed voor de werkzaamheden van een data engineer.
De 3 beste methodes om Python in te zetten voor je ETL proces
Voordat we dieper ingaan op de inzet van Python, eerst nog even terug naar de basis.
Waar staat ETL voor en waar past Python daarbinnen?
ETL is een afkorting die staat voor: Extract, Transform, Load.
Dit is het proces waarmee je data vanuit een of meerdere bronsystemen ophaalt (Extract), de data vervormt tot een betere structuur (Transform) en het in een datawarehouse laadt (Load).
Python kan worden ingezet in elk van deze ETL stappen. Sterker nog, het kan zelfs het gehele ETL proces voor zijn rekening nemen.
Er zijn namelijk tools die op basis van Python een volledige ETL oplossing bieden, tools waarmee je een maatwerk ETL oplossing vanaf nul kan opbouwen en tools die daar ergens ertussenin vallen.
De wijze waarop je Python het beste kan inzetten is afhankelijk van de situatie
Hoe je Python het beste kunt inzetten, hangt af van de situatie waarin jij je bevindt. Hieronder de drie meest voorkomende situaties.
- Ik heb een bestaande ETL oplossing en datawarehouse draaien.
- Ik ga een nieuwe ETL oplossing ontwikkelen voor mijn bestaande datawarehouse.
- Ik ga een volledig nieuwe ETL en datawarehouse oplossing opzetten.
Met de bovenstaande situaties als leidraad bespreken we hieronder de 3 methodes die het beste bij elke situatie passen. Zo kun je ontdekken hoe Python je in jouw situatie kan helpen.
Methode 1: voeg een afzonderlijk Python script toe aan het ETL proces
Geschikt voor alle situaties
Ongeacht de situatie waarin je je bevindt, het toepassen van een opzichzelfstaand Python script is bijna altijd wel een optie.
Ok, je collega’s moeten er wel mee instemmen. Het vraagt namelijk wel extra vaardigheden, documentatie en onderhoud. Als er geen beperkingen zijn vanuit je team of organisatie, dan kun je dit serieus overwegen.
Een opzichzelfstaand Python script kan problemen oplossen of functionele gaten dichten in je bestaande of nieuw te ontwikkelen ETL proces. Ook als je nieuwe ETL tool niet gebaseerd is op Python.
Denk bijvoorbeeld aan:
- het verbeteren van de performance van een langlopende ETL taak;
- het bouwen van validatie regels om de datakwaliteit te waarborgen;
- het extraheren van data vanuit een complexe REST API;
- het transformeren van data opgeslagen in een exotisch bestandsformaat.
Voorbeeld: je team werkt met on-premise ETL software dat elke nacht data overhaalt uit een productie database, transformeert naar een sterschema en vervolgens netjes inlaadt in een datawarehouse. Het proces draait stabiel tussen 00:00 en 06:00, maar zit qua doorlooptijd wel aan haar max.
Vanuit management is de vraag ontstaan om validatie te doen op bepaalde productiewaarden en alerts uit te sturen, indien ze onder een bepaalde waarde komen. Het probleem is alleen dat dit vroeg in het proces moet gebeuren en er geen ruimte meer is qua rekenkracht en tijd in de bestaande ETL oplossing.
Oplossing: je besluit om de gevraagde validaties in Python te bouwen en dit in de cloud uit te voeren via serverless computing. Je roept de Python oplossing aan vanuit de bestaande ETL pipeline, zodat de bestaande on-premise omgeving niet wordt belast en je wel aan de gevraagde functionaliteit kan voldoen.
Methode 2: bouw een ETL pipeline met Python
Geschikt voor alle situaties
De stap van een Python script die alleen maar transformeert naar een volledige ETL pipeline klinkt als een hele grote, maar is het eigenlijk niet!
Het enige dat ontbreekt is het extraheren uit de bron en het inladen in een datawarehouse. Dat klinkt misschien als veel werk, maar met de hulp van wat open source libraries is dit minder werk dan je zou verwachten.
Door libraries als pandas, requests en SQLAlchemy te benutten, is het bijvoorbeeld een kleine moeite om de:
- data op te halen uit een REST API;
- data in te laden in een pandas DataFrame;
- data in het DataFrame te transformeren;
- getransformeerde data in te laden in een database (datawarehouse).
Als je de code van je ETL pipeline bouwt op een modulaire manier, is deze herbruikbaar voor andere databronnen. Dat maakt je code overzichtelijker en bespaart je kostbare ontwikkeltijd.
Het laatste dat er moet gebeuren, is het afvuren van deze ETL pipelines op het juiste moment en in de juiste volgorde.
Afhankelijk van je omgeving en de beschikbare tools, kun je dit op verschillende manieren realiseren. Bijvoorbeeld door een simpele cronjob (unix), een Scheduled Task (Windows) of een bestaande ETL tool, zoals Azure Synapse Analytics, SSIS, Airflow of Azure Data Factory.
Voorbeeld: je werkt met SQL Server Integration Services (SSIS) als ETL oplossing en de business vraagt om data uit de HR software te ontsluiten naar het datawarehouse. Helaas kun je de data alleen via een REST API benaderen, welke geen duidelijke conventies volgt en een complexe authenticatieprocedure bevat. Daardoor kun je de REST API met de out-of-the-box SSIS acties (en zonder inkoop van plugins van derden) niet goed ontsluiten.
Oplossing: je ontwikkelt een Python script die gebruik maakt van bestaande open source libraries om de API calls te doen en de data binnen te halen in een Pandas DataFrame. Je transformeert de data in het DataFrame en persisteert het naar een staging tabel in een database, zodat SSIS het vanaf daar verder kan oppakken om te verwerken. Je roept het Python script aan vanuit je bestaande SSIS package, zodat het sequentieel wordt uitgevoerd en je geen gedoe hebt met timing en schedules.
Methode 3: bouw volledige ETL oplossingen in Python
Geschikt voor situatie 2 en 3
Ben je van plan om meer dan 1 Python script of pipeline te gaan bouwen?
En zitten er dan ook nog afhankelijkheden tussen die pipelines?
Dan ontkom je niet aan een tool die ook de Scheduling en Orchestration voor zijn rekening neemt.
Het bouwen van opzichzelfstaande Python scripts of ETL pipelines werkt goed wanneer de aantallen van dit soort scripts laag blijven.
Als je weet dat je 10+ pipelines gaat bouwen, is een stap naar een volledige ETL tool die rekening houdt met Orchestration en Scheduling echt noodzakelijk.
Grofweg zijn er 3 soorten ETL tools die met Python werken.
1. Tools waarbij je de ETL pipelines visueel in elkaar klikt via een User Interface, zoals Azure Synapse Analytics Pipelines, Azure Data Factory, of SQL Server Integration Services.
In dat geval bouw je je ETL pipeline vooral visueel en voer je Python code uit als een soort extern script. Het is dus geen integraal onderdeel van de ETL tool. Het ontwikkelen van de Python code doe je dan vaak in een aparte editor of IDE.
2. Tools die gebruikmaken van Apache Spark en daarmee ook Python code kunnen uitvoeren, de zogenaamde PySpark engine. Dit zie je bijvoorbeeld terug bij tools als Azure Synapse Analytics Notebooks, Databricks en AWS Glue. Apache Spark werkt met name goed als er grote hoeveelheden data verwerkt moeten worden door de parallelle verwerking.
In dit geval gebruik je de ETL tool voor scheduling en orchestration en voert de PySpark engine nog steeds je Python code uit. Het ontwikkelen van de Python code gebeurt dan vaak online in een (Jupyter) Notebook.
3. Tools die volledig op Python gebaseerd zijn, waarbij je de pipelines bouwt door ze volledig in Python te programmeren.
Enkele voorbeelden hiervan zijn Apache Airflow, Prefect en Luigi. Het ontwikkelen van de Python code gebeurt meestal in een aparte IDE.
Voorbeeld: binnen je organisatie wordt data steeds belangrijker en de financiële afdeling wil inzicht in de omzet en winst van de organisatie. Er is besloten dat een datawarehouse in combinatie met Power BI de juiste oplossing is. Je moet alleen nog een keuze maken met betrekking tot de ETL tooling. Daarnaast is er nog geen infrastructuur beschikbaar om dit alles in op te tuigen.
Oplossing: je besluit een Azure Subscription aan te maken, zodat je de nieuwe oplossing in de cloud kunt optuigen zonder dat bestaande infrastructuur er last van heeft. Je zet een SQL Database op en richt een Azure Synapse Analytics dienst in. Je kiest hiervoor omdat je in Synapse zowel visuele Pipelines als Notebooks (PySpark) kunt benutten, waardoor je klein begint en gaandeweg grotere en complexere ETL pipelines aan kan.
Is Python iets voor jou?
Zoals je kunt zien, zijn er verschillende methodes om Python toe te voegen aan je ETL proces en is er altijd wel een situatie te bedenken waarin het toegepast kan worden.
Uiteraard zijn er ook situaties te bedenken waarin het toepassen van Python geen logische keuze is. Bijvoorbeeld als je team geen enkele kennis heeft van Python, maar wel expert is op het gebied van R of Scala. Of als je data architectuur en infrastructuur dit niet toelaten.
Weeg daarom altijd grondig af of een uitbreiding van je platform met een nieuwe taal de juiste is.
Met ons sparren?
Dat was het wat betreft Python, ETL en datawarehousing! Heb je zelf nog ideeën of suggesties die je wilt delen? Of wil je eens met ons sparren over jouw datawarehousing?
Neem dan contact met ons op, we bespreken dit graag met je!