Ben je geïnteresseerd in het bouwen van een data engineering project van scratch, maar weet je niet waar je moet beginnen? Blijf vooral even lezen! In deze blogpost deel ik namelijk mijn ervaring met het werken aan mijn eerste data engineering project waarmee ik data uit mijn hygrometers wil halen. In dit blog neem ik je mee in de lessen die ik onderweg heb geleerd.
Introductie
Eind 2022 nam ik het besluit dat ik een “carrièreswitch” wilde maken van Cloud Native Engineer naar Data Engineer.
Ik had voor mezelf een ruw stappenplan gemaakt over hoe ik dacht de overstap te kunnen maken. Ik studeerde en slaagde voor het DP-900 Azure Data Fundamentals examen en begon meteen te studeren voor het DP-203 Azure Data Engineering examen. Ik merkte al snel dat mijn SQL te roestig was en ik miste een stevige basis aan kennis en ervaring met Python.
Nadat ik advies gevraagd had en op internet had rondgekeken besloot ik de Data Engineering met Python Career Track van Datacamp te gaan doen, maar voordat ik daaraan kon beginnen heb ik eerst de SQL Fundamentals, Python Fundamentals en Python Programming Skill tracks afgerond. Alle tracks zijn korte video's waarin een onderwerp wordt uitgelegd en vervolgens ga je direct met hands-on oefeningen aan de slag. Ik vind de Datacamp-cursussen erg leuk en leerzaam en zou ze iedereen aanraden die (meer over) SQL, Python en Data Engineering wil leren.
In plaats van dat ik me ging concentreren op het DP-203 examen besloot ik dat ik eerst meer hands-on ervaring wilde opdoen met SQL en Python, dus begon ik aan mijn eerste dataproject te werken. In dit project wilde ik ervoor zorgen dat ik verschillende databronnen en dataformaten kon gebruiken voor het extraheren en transformeren.
Projectdoel
Voor mijn eerste data engineering project wilde ik dus een project bouwen om hands-on ervaring op te doen met Python en SQL en tegelijk het ook gebruiken voor mijn portfolio.
De vraag was: welke data ga ik gebruiken? Je kunt overal gratis data vandaan toveren om te gebruiken voor een dataproject, maar ik wilde iets maken met een eigen dataset. Een paar maanden geleden heb ik in verschillende kamers in mijn huis hygrometers geplaatst die de luchtvochtigheid en temperatuur meten. Toen kwam ik op het idee om de vochtigheidsgegevens te verzamelen en te gebruiken. Die data wilde ik dan combineren met onder andere externe weergegevens en mijn elektriciteits- en gasverbruik om er wat inzichten uit te halen.
De belangrijkste focus van dit project is het extraheren, transformeren en laden van de data in een PostgreSQL database.
Hulpmiddelen en technologieën
Clouddienst
Mijn expertise en ervaring zit in het werken met Azure. Daarnaast gebruik ik Azure dus als Clouddienst. Voor dit project maakte ik dan ook gebruik van de volgende Azure Services:
- Azure Storage-account
- Azure PostgreSQL
Programmeertaal
Een van mijn doelen is om praktijkervaring op te doen met Python en SQL in een Data Engineering-project. Het is dus geen verrassing dat ik Python als taal voor dit project heb gebruikt.
Data Stack
Ik wilde de set-up niet te ingewikkeld maken voor mijn eerste project, omdat een van de doelen is om hands-on ervaring op te doen met Python en SQL. Vanwege mijn ervaring met GitHub en GitHub Actions heb ik voor GitHub Workflows gekozen om de data pipeline uit te voeren.
Versiebeheer
Ik heb GitHub gekozen als tool voor het uitvoeren van de datapijplijnen, dus de meest logische keuze is om GitHub ook te gebruiken voor versiebeheer. Zo staat het allemaal op 1 plek.
Project Set-up
Directory structuur
- .github/workflows: Deze folder bevat de Github-workflows.
- Meer informatie over de specifieke workflows vindt u in de sectie Workflows.
- /data: Deze map bevat het CSV-bestand met luchtvochtigheidsdata.
- /etl: Deze map bevat de code voor het ETL-proces. Het bevat:
- __init__.py: Dit bestand initialiseert het etl package en importeert modules uit de /etl directory.
- constants.py: Bevat alle variabelen die in het project worden gebruikt.
- humidity_data_etl_pipeline.py: Bevat de User Defined Functions die specifiek zijn voor het transformeren van de luchtvochtigheidsgegevens.
- utils.py: Bevat generieke User Defined Functions die in het hele project worden gebruikt.
- weather_data_etl_pipeline.py: Bevat de User Defined Functions die specifiek zijn voor het transformeren van data dat is opgehaald via de weer API.
- /scripts/bash: Deze directory bevat een bash-script dat het CSV-bestand uploadt naar een Azure Storage Account.
- requirements.txt: Dit bestand bevat de Python packages die nodig zijn om het project uit te voeren.
Package
In het etl package zitten verschillende modules, onderstaand schema geeft de afhankelijkheid tussen de modules weer.
Workflows
Het project heeft vier workflows:
- codeql-code-analysis.yml: Deze workflow voert een code-analyse uit op de code van deze repository om beveiligingsproblemen te vinden.
- flake8-lint.yml: Deze workflow voert de flake8 linter uit op de Python-code in de /etl-directory. De workflow loopt:
- handmatig
- Met een Pull Request
- Met een Push naar de main branch
- vochtigheid-data-etl-pipeline.yml: Deze workflow extraheert, transformeert en laadt de luchtvochtigheidsgegevens, van het geüploade CSV-bestand, in de Azure PostgreSQL database. De workflow runt:
- Handmatig
- upload-humidity-data.yml: Deze workflow upload het CSV-bestand naar een Azure Storage Account. De workflow runt:
- Handmatig
- weather-data-etl-pipeline.yml: Deze workflow extraheert, transformeert en laadt de weergegevens op van een weer API en laadt de gegevens in dezelfde Azure PostgreSQL database. De workflow runt:
- Handmatig
Data Engineering Processes
ETL Process
Voor dit project heb ik het ETL-proces gebruikt, een combinatie van drie processen:
- Extract
Ruwe data wordt uit één of meerdere bronnen gehaald
Bjiv. JSON, XML, CSV, relationele databases - Transformeren
De ruwe data wordt aangepast
Bijv. Data types converteren, data opschonen, data combineren - Laden
De getansformeerde data kan beschikbaar worden gesteld aan de afnemers en gebruikers
Bijv. Data dat naar een database/datawarehouse is weggeschreven
Extract
De twee gegevensbronnen zijn:
- Een Azure Storage Account waarin een CSV-bestand wordt geüpload en die CSV bevat de luchtvochtigheidsgegevens van mijn woonkamer
- Een weer API die gegevens levert in JSON formaat
Azure Authenticatie
Om een bestand van Azure Storage Account op te kunnen ophalen moet ik me eerst authentiseren. Ik heb de class DefaultAzureCredential uit het package azure.identity gebruikt.
<script src="https://gist.github.com/bramvdklinkenberg/70c1b2eca75e7f281640d4d410fde217.js"></script>
DefaultAzureCredential is afhankelijk van de volgende environment variabels:
- AZURE_CLIENT_ID
- AZURE_CLIENT_SECRET
- AZURE_TENANT_ID
Azure Storage Account
Om verbinding te maken met mijn Azure Storage Account heb ik de BlobClient uit het azure.storage.blob package gebruikt.
<script src="https://gist.github.com/bramvdklinkenberg/333c2c4c87246be1f7c34d60a153228b.js"></script>
Weer API
Om door middel van Python data van een API op te halen, kunnen we de Requests HTTP library gebruiken.
Transform
CSV
Om de CSV-data te kunnen transformeren gebruik ik Pandas DataFrame.
<script src="https://gist.github.com/bramvdklinkenberg/2c09272accd953d02437d652fb2fb42e.js"></script>
Via de weer API hebben we nu ruwe JSON data, en kunnen we de ingebouwde JSON-decoder uit de Requests library gebruiken. Net als bij de CSV data heb ik het JSON object omgezet naar een Pandas Dataframe.
Laden
PostgreSQL
Voor mijn project gebruik ik een Azure PostgreSQL database, dus ik gebruik Psycopg om verbinding te maken met de database. Psycopg is een van de populairste PostgreSQL databaseadapters in Python.
<script src="https://gist.github.com/bramvdklinkenberg/37370c875ee6b5fbe5bb770f6aa7ba2e.js"></script>
Lessons Learned
Voordat je begint met het schrijven van code:
- Denk na over de opzet en structuur van het project in Github. Belangrijk!
- Ontwerp een datamodel en dataschema. Hoewel de focus van dit project op ETL ligt, is het verstandig om een datamodel en schema te hebben.
- Quote uit "Fundamentals of Data Engineering by Joe Reis & Matt Housley".
- Een data-architectuur weerspiegelt de doelen en bedrijfslogica van een organisatie.
- Schrijf unittest tijdens het ontwikkelproces
- Schrijf data kwaliteitscontroles tijdens het ontwikkelproces.
En hoe nu verder?
In het project heb ik een TODO.md toegevoegd met taken die ik nog wil uitvoeren.
Na dit eerste project ga ik aan de slag met verschillende set-ups, met dezelfde data, maar met tools als Airflow, Mage, Azure Data Factory, Azure Synapse, Azure Databricks, PySpark etc. Op deze manier kan ik nog meer hands-on ervaring opdoen met verschillende tools en technologieën.