Die Hauptaufgaben des ETL-Prozesses
Der ETL-Prozess dient dazu, Daten aus verschiedenen Quellen zu integrieren, zu bereinigen und in einer Form zu speichern, die für die Analyse geeignet ist. Da der Prozess nicht komplett im Hauptspeicher abläuft, ist ein Zwischenspeicher (die sogenannte Staging Area) notwendig.
Der ETL-Prozess besteht aus drei Phasen: Extrahieren, Transformieren und Laden.
1. Extrahieren
In dieser Phase werden die Daten aus verschiedenen Quellen in eine Staging Area überführt:
- Die Daten werden aus den Quellen gefiltert.
- Das benötigte Format, der Zeitpunkt und der Ort der Daten werden bereitgestellt.
- Änderungen in den Quelldaten werden erkannt:
- Dies kann entweder durch aktive Meldung der Quelle erfolgen oder durch die Ermittlung der Änderungen.
- Ein Extraktor ist die Komponente, die die Daten aus den Quellen extrahiert:
- Die Lieferzeitpunkte der Daten können periodisch, synchron oder ereignisgesteuert sein.
- Die Daten können geliefert werden als:
- Kompletter Datenbestand (Snapshot)
- Alle Änderungen (Logfile)
- Nettoänderungen zu festen Zeitpunkten (Snapshot-Differenz)
2. Transformieren
In dieser Phase werden die extrahierten Daten in ein einheitliches Format gebracht und für die Analyse vorbereitet:
2. Transformieren
In dieser Phase werden die extrahierten Daten in ein einheitliches Format gebracht und für die Analyse vorbereitet.
Transformationsschritte:
-
Selektion bestimmter Datensätze: Auswahl von Datensätzen basierend auf Bedingungen.
- Beispiel: Attribute ‘A’ nicht NULL und ‘C’ > 10.
-
Projektion bestimmter Spalten: Reduktion auf relevante Spalten.
- Beispiel: Auswahl von ‘B’, ‘C’, ‘E’.
-
Pivotisierung von Zeilen in Spalten: Zeilen werden zu Spalten aggregiert.
- Beispiel: Bestellungen nach Kategorie und Status.
-
Automatisches Erkennen und Korrigieren: Fehlerhafte Daten werden angepasst.
- Beispiel: Firmennamen wie “AG” erkannt und standardisiert.
-
Separieren/Zusammenfassen von Feldern: Aufteilen oder Zusammenführen von Feldern.
- Beispiel: “Max Mustermann” → Vorname: Max, Nachname: Mustermann.
-
Disaggregation von Werten: Werte in separate Tabellen auslagern.
- Beispiel: Sensorwerte und Zeiten getrennt speichern.
Weitere Transformationsaufgaben:
-
Vereinheitlichung von Formaten: Einheitliche Datenformate.
- Beispiel: Datum → “DD.MM.YYYY”.
-
Konvertierung von Einheiten: Einheiten angleichen.
- Beispiel: cm und inch → mm.
-
Matching und Deduplizieren: Duplikate erkennen und entfernen.
- Beispiel: Gleicher Name + Geburtsdatum → 1 Eintrag.
-
Konsistenzprüfung: Wertevalidierung.
- Beispiel: Bewertung nur “Rot”, “Gelb”, “Grün”.
-
Vereinheitlichung von Codierungen: Unterschiedliche Codierungen angleichen.
- Beispiel: 1/0, “Male/Female” → “M/F”.
-
Berechnung abgeleiteter Werte: Zusätzliche Werte berechnen.
- Beispiel: Dauer zwischen Start- und Endzeit.
-
Aggregation von Daten: Zusammenfassen auf höhere Granularität.
- Beispiel: Gesamtwert eines Verkaufs berechnen.
Abgleich (Reconciliation):
Überprüfung der Konsistenz zwischen Quelle und Ziel, z.B. Stammdatenabgleich.
3. Laden
In der letzten Phase werden die transformierten Daten in das Data Warehouse (DWH) geladen:
- Strategien hängen von den Anforderungen und dem verfügbaren Zeitfenster ab.
- Die Aktualisierung kann:
- Stündlich, täglich oder wöchentlich erfolgen.
- Daten können entweder angehängt oder überschrieben werden.
Einfügen in mehreren Tabellen
- Standard erlaubt mit einer INSERT-Anweisung nur das Einfügen in einer Tabelle
Erweiterung der INSERT
Diese ermöglicht das gleichzeitige Einfügen in mehrere Tabellen.
INSERT [ALL|FIRST]
{WHEN <Bedingung> THEN
{INTO ... VALUES}}
[ELSE
INTO ... VALUES}]
<SELECT-Anweisung>;
- INSERT
ALL
fügt jeden Datensatz der SELECT-Anweisung gemäß der formulierten Bedingungen ein - INSERT
FIRST
fügt jeden Datensatz nur bei der ersten passenden Bedingung ein
Beispiel
- Es sollen Tabellen für drei Kundenkategorien befüllt werden:
- Kategorie III: Über 3000 €
- Kategorie II: Über 3500 €
- Kategorie I: Über 4000 €
- Fall A: Kunden der höheren Kategorien sollen auch in den niedrigeren Kategorien erscheinen
- Fall B: Kunden aus einer höheren Ka
- Vorgehen
- Zuerst Tabellen anlegen
CREATE TABLE Kunde_Kat_III( ID NUMBER(10) PRIMARY KEY, Name VARCHAR2(50), Vorname VARCHAR2(50), Umsatz NUMBER(10,2));
- Für die anderen beiden Kategorien analog
- Fall A kann mit
ALL
gelöst werden
INSERT ALL WHEN Umsatz>3000 THEN INTO Kunde_Kat_III WHEN Umsatz>3500 THEN INTO Kunde_Kat_II WHEN Umsatz>4000 THEN INTO Kunde_Kat_I SELECT * FROM Kunden_Extern_Fest;
- Fall B kann
FIRST
gelöst werden
INSERT ALL WHEN Umsatz>3000 THEN INTO Kunde_Kat_III WHEN Umsatz>3500 THEN INTO Kunde_Kat_II WHEN Umsatz>4000 THEN INTO Kunde_Kat_I SELECT * FROM Kunden_Extern_Fest;
-
WHEN-Bedingung ist hier wichtig
Vergleich Performancemessung
Testbedingungen:
- Datenmenge: 1.000.000 Datensätze
- Messungen: Jeweils drei Durchläufe mit Mittelwertbildung
Fälle | Gleichzeitiges Einfügen (min:sec) | Standard-SQL (min:sec) |
---|---|---|
Fall A | 8:39 | 26:04 |
Fall B | 9:19 | 27:06 |
Das gleichzeitige Einfügen spart erheblich Zeit.
- Die Zeiteinsparung entspricht in etwa der Anzahl der
WHEN
-Bedingungen Dies macht das gleichzeitige Einfügen besonders effizient für Szenarien mit komplexen Bedingungen oder großen Datenmengen.
MERGE INTO-Anweisung
ermöglicht kombinierte Anwendung
- Syntax
MERGE INTO <Tabelle>
USING (<SELECT-Anweisung> oder <Tabelle> oder <View>)
ON (<Verbundbedingung>)
WHEN MATCHED THEN
<Aktualisierungsanweisung>
WHEN NOT MATCHED THEN
<Einfügeanweisung>;
Beispiel
- Fakttabelle F, neue Daten sollen hinzugefügt werden:
- Ist Datensatz neu, dann einfügen
- Ist Datensatz schon vorhanden, dann Attribut valueerhöhen
MERGE INTO F -- bestehende Tabelle
USING NeueDaten N -- Neuetabele
ON (F.ID1 = N.ID1 AND F.ID2 = N.ID2 AND F.ID3 = N.ID3)
WHEN MATCHED THEN
UPDATE SET F.VALUE = F.VALUE + N.VALUE
WHEN NOT MATCHED THEN
INSERT VALUES (N.ID1, N.ID2, N.ID3, N.VALUE);
MERGE INTO-Anweisung mit WHERE
Aktualisierungs- und Einfügeoperation dürfen WHERE-Klausel haben
- Beispiel:
- Tabelle N habe Zeitstempel
- Aktualisierung nur bei jüngeren Datensätzen
MERGE INTO F -- bestehende Tabelle
USING NeueDaten N -- Neuetabele
ON (F.ID1 = N.ID1 AND F.ID2 = N.ID2 AND F.ID3 = N.ID3)
WHEN MATCHED THEN
UPDATE SET F.VALUE = F.VALUE + N.VALUE
WHERE N.Timestamp > '01-02-2020' -- Hier WHERE
WHEN NOT MATCHED THEN
INSERT VALUES (N.ID1, N.ID2, N.ID3, N.VALUE);
Bei INSERT-Anweisung analog möglich
MERGE INTO-Anweisung mit DELETE
Anstelle Aktualisierungsoperation darf DELETE-Operation ausgeführt werden
- Beispiel:
- Tabelle N habe Zeitstempel
- Lösche alte Datensätze
MERGE INTO F
USING NeueDaten N
ON (F.ID1 = N.ID1 AND F.ID2 = N.ID2 AND F.ID3 = N.ID3)
WHEN MATCHED THEN
WHEN NOT MATCHED THEN
INSERT VALUES (N.ID1, N.ID2, N.ID3, N.VALUE)
Bei INSERT-Anweisung nicht sinnvoll