ETL = Extract, Transform, Load
ETL ist der klassische Prozess, um Daten aus operativen Quellsystemen (z.B. ERP, CRM, Shop, IoT/BDE) so aufzubereiten, dass sie verlässlich in ein analytisches Zielsystem (Data Warehouse, Data Mart, Lakehouse, Semantic Model) geladen und dort für Reporting, OLAP oder Advanced Analytics genutzt werden können.
In der Data-Warehouse-Architektur ist ETL typischerweise mit Arbeitsbereich / Staging Area und einer ETL-Komponente verknüpft: Daten werden zunächst extrahiert, im Staging regelbasiert transformiert und integriert, anschließend ins DWH geladen (und danach im Staging wieder gelöscht).
Was bedeutet ETL?
Extract (Extraktion) bedeutet: Daten werden aus einer oder mehreren Datenquellen entnommen und in einen Arbeitsbereich (Staging) übertragen. Dabei ist zu entscheiden, welche Daten relevant sind und wie häufig sie extrahiert werden (z.B. täglich, stündlich, near-real-time).
Transform (Transformation) bedeutet: Daten werden in ein einheitliches, zielkonformes Format gebracht. Dazu gehören u.a. Standardisierung (Datums-/Währungs-/Schreibweisen), Bereinigung (Fehler korrigieren/entfernen), Integration (Schlüsselabgleich, Dubletten, Referenzen) und fachliche Regeln (Business Rules).
Load (Laden) bedeutet: Daten werden in das Zielsystem geschrieben. In der Praxis unterscheidet man häufig zwischen Initial Load (einmalige Erstbeladung) und Refresh (regelmäßige Nachladung/Delta-Ladung), inklusive Protokollierung, Fehlerbehandlung und Abstimmung (Reconciliation) mit Quelle und Ziel.
Merksatz: ETL macht aus „Transaktionsdaten“ eine „Analyse-fähige Datenbasis“ – und zwar reproduzierbar, kontrollierbar und prüfbar (Audit-fähig).
Was ist der Unterschied zu ELT und wann findet das Anwendung?
Bei ETL wird vor dem Laden transformiert: Quelle → Staging/ETL → Ziel. Das passt gut, wenn das Zielsystem eher „klassisch“ ist (z.B. relationales DWH) oder wenn Transformationen zentral gesteuert, versioniert und als stabile Datenprodukte bereitgestellt werden sollen.
Bei ELT (Extract-Load-Transform) werden Daten zunächst roh oder nur leicht aufbereitet geladen (z.B. in einen Data Lake / Lakehouse) und erst im Zielsystem transformiert – oft mit SQL, Spark oder Modellierungswerkzeugen. Das ist besonders nützlich, wenn sehr große Datenmengen anfallen, Cloud-Skalierung genutzt wird und mehrere Teams unterschiedliche Sichten/Transformationen benötigen.
Praxisregel: ELT eignet sich häufig für moderne Plattformen (Lakehouse, Fabric, Databricks, BigQuery), weil Rechenleistung elastisch im Zielsystem verfügbar ist. ETL ist oft passend, wenn Transformationen streng standardisiert sind, Datenqualität früh „abgesichert“ werden soll oder Quellsysteme geschützt werden müssen (Last/Performance).
In Power BI siehst du ELT-Denken z.B. dann, wenn Rohdaten in einem Lake/SQL landen und Transformationen (Power Query/SQL) sowie das semantische Modell (DAX/Measures) darauf aufsetzen.
Welche wichtigen Schritte gibt es im ETL/ELT?
In der Praxis ist ETL nicht nur „E-T-L“, sondern ein End-to-End-Prozess mit Qualitäts- und Betriebsaspekten: Datenanbindung & Extraktionsstrategie (Voll/Delta/CDC), Staging, Datenprofiling, Datenbereinigung, Standardisierung, Integration/Key-Management, Historisierung, Validierung/Tests, Laden (Initial/Refresh), Monitoring/Logging, sowie Metadaten- und Regelmanagement.
Besonders prüfungs- und praxisrelevant: Staging/Arbeitsbereich als Puffer, um Quellsysteme und DWH im laufenden Betrieb zu schützen (Entkopplung), sowie die Idee, Daten nach Regeln zu transformieren und zu integrieren, bevor sie dauerhaft ins DWH wandern.
Optionaler Baustein: Ein ODS (Operational Data Store) kann eine integrierte, detaillierte und eher „zeitnahe“ Datenhaltung ermöglichen (z.B. für Auswertungen, die im Quellsystem schwierig sind). Er liegt konzeptionell näher am Operativen als ein historisiertes DWH.
Was unterscheidet operationale von dispositiven Daten? Kurze Zusammenfassung:
Operative Daten dienen der Abwicklung des Tagesgeschäfts: sehr aktuell, transaktions-/funktionsorientiert, granular, häufig redundant/inkonsistent, laufende Updates und konkurrierende Zugriffe.
Dispositive Daten dienen der Entscheidungsunterstützung: sachgebiets-/themenorientiert, konsistent modelliert, kontrollierte Redundanzen, historienfähig, verdichtet/transformiert, mit umfassendem Metadatenangebot für Analyse & Reporting.
Kurz gesagt: Operativ = „Was passiert gerade?“ — Dispositiv = „Was bedeutet das für Steuerung/Planung?“. ETL/ELT ist die Brücke zwischen beiden Welten.
Typische Stolpersteine im ETL-Betrieb (und wie man sie entschärft)
Häufige Ursachen für kaputte Reports sind nicht „falsche DAX-Formeln“, sondern Datenprobleme im ETL: fehlende Werte, uneinheitliche Codes (z.B. „DE“, „Deutschland“, „GER“), Dubletten, falsch interpretierte Datumsformate, oder „stille“ Schemaänderungen in Quellsystemen (neue Spalten, geänderte Bedeutung).
Gute Praxis ist daher: Data Profiling + Validierungsregeln (z.B. Wertebereiche, Referenzen), Logging (welcher Lauf, welche Anzahl, welche Fehler), und ein klarer Umgang mit Fehlern (Reject-Table/Quarantäne statt stiller Korrektur).
Ergänzend lohnt sich Metadatenpflege: Definitionen (fachlich), technische Informationen (Linage), Transformationsregeln und Historie – damit Anwender wissen, was eine Kennzahl wirklich bedeutet und wie sie entsteht.
Tipp: Zeile anklicken, um sie zu markieren. Mit den Buttons kannst du die Tool-Spalten filtern.
| ETL-Schritt | Definition (kurz & praxisnah) | Wie im BI-Kurs genannt? (**) | Beispiel aus R | Beispiel aus PowerBI/DAX | Beispiel aus Python |
|---|---|---|---|---|---|
| E1 Datenanbindung Extract |
Daten aus operativen Systemen anbinden (DB, Dateien, APIs). Entscheiden: Aktualität (Batch/near-real-time), Last für Quellsysteme, Zugriff/Netzwerk, Authentifizierung. Ergebnis: reproduzierbarer Zugriff auf Rohdaten. | Datenquellen (interne/externe) + Stufe „Staging“ in der BI-Architektur |
DBI::dbConnect() + dbGetQuery() (z.B. PostgreSQL) oder Dateien via
readr::read_csv() aus einem Landing-Ordner.
|
Power BI: Get Data (SQL/SharePoint/API). Für On-Prem: On-premises data gateway. Im Service: geplante Aktualisierung (Scheduled Refresh). |
sqlalchemy für DB-Zugriff oder requests.get() für REST-API.
Dateien via pandas.read_csv() aus einem Landing-Folder.
|
| E2 Extraktionsstrategie Extract |
Festlegen, welche Daten und wie oft extrahiert werden: Voll-Extrakt, Delta-Extrakt, oder CDC (Change Data Capture). Ziel: „genug aktuell“ bei vertretbaren Kosten. | Extraktion (Phase 1 im ETL-Prozess) |
Delta per Zeitstempel: WHERE updated_at > :last_run. Ablage von last_run z.B. in einer kleinen Control-Tabelle.
|
Power BI: In Power Query Incremental Refresh (RangeStart/RangeEnd) und Policy im Dataset. | CDC per Zeitstempel oder Log-Tabelle; Speicherung von Watermarks (z.B. in SQLite/JSON). Bei APIs: Paging + „since“ Parameter. |
| E3 Data Profiling Extract |
Vor Transformation: Daten „vermessen“ (Null-Raten, Dubletten, Wertebereiche, Ausreißer, unerwartete Kategorien). Ziel: Risiken früh erkennen und Regeln ableiten (Data Quality). | (oft implizit) Datenqualitätsmanagement / Qualitätsplanung |
dplyr::summarise() + skimr::skim() für schnelle Profile:
Missing-Quote, Min/Max, Häufigkeiten.
|
Power Query: Column quality / Column distribution.
Zusätzlich DAX-Checkmeasure: MissingRate = DIVIDE([MissingCount],[RowCount]).
|
pandas.DataFrame.describe(), Missing-Anteile via df.isna().mean(),
Kategorien via value_counts().
|
| E4 Staging / Landing Extract |
Rohdaten temporär ablegen (Landing/Staging), um Quellsysteme zu entlasten und Läufe reproduzierbar zu machen. Oft inkl. unveränderter „Raw Copy“ (Audit) + technischer Metadaten (Load-Timestamp, Source-System). | Arbeitsbereich / Staging Area |
Schreiben in Parquet/CSV pro Lauf (z.B. yyyy-mm-dd-Ordner). Anschließend Transformation aus dem Staging.
|
Power BI: Staging oft außerhalb (Dataflow, Lakehouse/SQL). In Power Query: „Staging Queries“ als Referenz-Abfragen. |
Landing in Objekt-Storage (z.B. Filesystem/S3-ähnlich): df.to_parquet().
Pro Lauf Ordner + Manifest (RowCount/Checksum).
|
| T1 Standardisieren Transform |
Einheitliche Formate herstellen (Datum/Zeit, Währung, Dezimaltrennzeichen, Groß-/Kleinschreibung, ISO-Codes). Ziel: Vergleichbarkeit über Quellen hinweg. | Transformation (Phase 2 im ETL-Prozess) |
lubridate::ymd() / parse_number();
Codes via Lookup-Tabelle: left_join(country_map).
|
Power Query: Datentypen sauber setzen (Date/Decimal). DAX: z.B. FORMAT([Date],"YYYY-MM") für Anzeige
(nicht als Transform-Ersatz, eher Präsentation!).
|
pd.to_datetime(), Währung in EUR via Umrechnungstabelle,
Strings via .str.upper().str.strip().
|
| T2 Bereinigen Transform |
Fehler korrigieren oder isolieren: Dubletten, ungültige Werte, fehlende Pflichtfelder, Plausibilitätsregeln (z.B. negative Menge). Wichtig: Korrekturen nachvollziehbar machen (Log/Rule). | Transformation; häufig als „Bereinigung“/„Datenqualität“ diskutiert |
Dubletten: dplyr::distinct(key, .keep_all=TRUE).
Quarantäne: filter(is.na(customer_id)) in Reject-Dataset.
|
Power Query: Remove duplicates, Replace values, Keep errors.
Datenqualitäts-Maß: InvalidRows = COUNTROWS(FILTER(Table, Table[Qty]<0)).
|
df.drop_duplicates(subset=[...]),
Validierung: assert (df["qty"]>=0).all() (oder Fehler in Reject-Frame schreiben).
|
| T3 Integrieren Transform |
Daten aus mehreren Quellen zusammenführen (Konforme Dimensionen, Schlüsselabgleich, Referenzen). Typisch: Kunden/Produkte aus ERP + Transaktionen aus Shop + Marketingkanäle aus CRM. | „vereinheitlichen“, „konsolidieren“, „integrieren“ (DWH-Zielsetzung) |
Schlüsselabgleich via Mapping: left_join() + Konflikt-Check (Mehrdeutigkeiten).
Surrogate Keys z.B. durch fortlaufende IDs.
|
Power BI Modell: Beziehungen (Star Schema). Power Query: Merge Queries.
DAX: Nur wenn nötig Lookup: RELATED(DimCustomer[Segment]).
|
Integration via merge() + Validierung (validate="m:1").
Keys: Surrogate via Hash (hashlib) oder ID-Tabelle.
|
| T4 Historisieren Transform |
Änderungen über Zeit nachvollziehbar halten (z.B. Slowly Changing Dimensions). Beispiel: Kunde wechselt Region/Segment – Analysen sollen „damals“ vs. „heute“ unterscheiden können. | Zeitbezug/Historienbetrachtung (dispositive Daten) |
SCD2-Logik: „gültig_von/gültig_bis“ + aktuelle Zeile markieren.
Umsetzung mit dplyr + Window-Funktionen (oder SQL).
|
Power BI: Historisierung typischerweise im ETL/Source (Power Query/SQL). DAX nutzt dann Filter über Datum / Gültigkeitsintervalle. |
SCD2 mit Pandas:
neue Version erzeugen, alte schließen (valid_to setzen),
is_current Flag pflegen.
|
| T5 Aggregieren Transform |
Verdichten für Performance und fachliche Nutzung (z.B. Tagesumsatz je Filiale, Monatskosten je Kostenstelle). Wichtig: Aggregationen müssen zu KPI-Definitionen passen (Semantik!). | Verdichtung/Transformation; Data Marts als thematische Ausschnitte |
group_by(store_id, date) + summarise(revenue=sum(...)).
|
DAX Measures statt physischer Aggregation (oft besser):
TotalRevenue = SUM(FactSales[Revenue]),
Performance ggf. durch Aggregation Tables/Import.
|
df.groupby(["store_id","date"], as_index=False)["revenue"].sum(),
Speicherung als „agg“-Tabelle/Parquet.
|
| L1 Laden: Initial Load Load |
Einmalige Erstbeladung des Zielsystems. Fokus: Vollständigkeit, stabile Performance (Batches), sowie „Baseline“ für spätere Delta-Läufe. | Initial load |
Schreiben in DB via dbWriteTable(..., overwrite=TRUE).
RowCounts prüfen: Quelle vs Ziel.
|
Power BI: Erstimport in Dataset / Dataflow. Danach Modellierung (Beziehungen, Measures). |
Bulk Load (z.B. to_sql(method="multi")).
Bei großen Mengen: Batch Inserts + Indizes erst nach Load.
|
| L2 Laden: Refresh / Delta Load |
Regelmäßige Nachladung (inkrementell). Ziel: nur Änderungen übertragen, sauber zusammenführen (Upsert/Merge), Historisierung beachten. | Refresh (regelmäßig) |
Delta-Load per Upsert in SQL (z.B. INSERT ... ON CONFLICT DO UPDATE).
Steuerung über Watermark.
|
Power BI: Scheduled Refresh + (falls passend) Incremental Refresh. Wichtig: Data Source Credentials & Gateway stabil betreiben. |
Upsert via SQL MERGE (DB-abhängig) oder „staging table“ + Merge Statement.
Logging: Lauf-ID, Rows inserted/updated/rejected.
|
| L3 Validieren & Reconciliation Load |
Nach dem Laden: Abgleich, ob das Ziel „stimmt“ (RowCounts, Summen/Kennzahlen, Checksums). Ziel: Vertrauen und frühe Fehlererkennung, bevor Reports falsche Entscheidungen auslösen. | (oft implizit) Qualitätssicherung / Kontrollmechanismen |
Kontrollsummen: sum(revenue) Quelle vs Ziel (pro Tag/Filiale).
Abweichungen in Audit-Tabelle loggen.
|
DAX „Sanity Measures“: RowCount = COUNTROWS(FactSales),
TotalRevenue gegen Erwartungswerte/Control Table.
|
Checksums pro Partition (z.B. Tag) + „diff report“ als CSV/HTML. Optional: Great Expectations / pandera (Regeln als Tests). |
| Querschnitt: Logging & Monitoring Betrieb |
Ohne Monitoring ist ETL „blind“: Laufzeit, Fehlerquote, Volumenänderungen, Schema-Änderungen. Gute Praxis: Run-ID, Zeitstempel, Status, RowCounts je Stufe (Extract/Transform/Load), Alarmierung. | Metadaten / Protokollierung (technische Metadaten) |
Simple: Log-Tabelle (CSV/DB) + glue::glue() Nachrichten.
Warnung bei Volumensprung (z.B. +50%).
|
Power BI Service: Refresh-Historie + ggf. Monitoring im Fabric/Workspace. Zusätzlich „Control Report“ im Dataset (Status je Quelle). |
logging + strukturierte Logs (JSON) + Laufmetrik in DB.
Alarm via Mail/Teams Webhook bei Failure.
|
Mini-Checkliste (praxisnah): 1) Sind Quellen & Aktualität klar? 2) Gibt es Profiling/Regeln? 3) Sind Transformationen versioniert? 4) Gibt es Initial-Load + Delta-Strategie? 5) Sind Validierung & Logs vorhanden?
| *) | Warum so viel „Drumherum“? In der Praxis scheitern BI-Lösungen selten an „zu wenig Daten“, sondern an fehlender Reproduzierbarkeit: Wenn niemand erklären kann, wie Daten entstanden sind, sind Reports nicht audit-fähig und Entscheidungen werden riskant. |
| **) | Die Spalte „Wie im BI-Kurs genannt?“ ist als Orientierung gedacht: Begriffe wie Arbeitsbereich/Staging, ETL-Komponente, ODS, sowie die Unterscheidung Initial load vs. Refresh tauchen in der Kurslogik rund um DWH-Architekturen und ETL-Prozesse auf. In Projekten können die Begriffe je nach Tool (Fabric/ADF, SSIS, dbt, Talend, Informatica) leicht variieren. |
| ***) | Als „BI-Kurs“ wird hier insbesondere das Master-Modul Business Intelligence (FernUni Hagen) verstanden. Diese Spalte hilft, kursnahe Begriffe von rein tool-spezifischen Details zu trennen. |