Beispiele (ETL/ELT)

Jede ETL/ELT-Pipeline besteht aus mindestens einem ETL/ELT-Task.

Jeder Task hat dabei eine Quelle und eine Ziel.

Es wird jeweils eine Zeile der Quelldaten eingelesen, egal was die Datenquelle ist. Daraus wird eine Zeile der Zieldaten erzeugt, bis die Quelldaten abgearbeitet sind.

Beispiel 1 (ETL/ELT-Quellfelder)


Gehen wir von einer Pipeline mit einem Task aus.

Wir verwenden als Datenquelle folgende einfache CSV-Datei (mit Kopfzeile) und wollen im Ziel ebenfalls in eine CSV-Datei schreiben.


./webapps/root/upload/test_1_in.csv
Vorname,Nachname,Punkte
Robert,Hammer,55


Wir legen eine neue ETL/ELT-Pipeline (1) mit dem Namen My_pipeline_1 an und lassen alle Default-Einstellungen.

Dann erzeugen wir einen neuen ETL/ELT-Task (2) mit dem Namen my_task_1 und springen direkt in die Quelldaten (3) und stellen diese auf den Typ CSV/Text.

Dort geben wir den Pfad (4) zu unserer CSV-Datei an und setzen die Checkbox (5), um anzuzeigen, dass unserer Datei eine Kopfzeile enthält. Als Trennzeichen (6) geben wir ein Komma an.


images/download/attachments/131696646/1413-version-2-modificationdate-1692784617947-api-v2.png


Wie Sie unterhalb von (4) erkennen können, wurden durch das Setzen von (5) bereits die Spalten-Namen erkannt.

Wir erinnern uns, dass aus den Quelldaten jeweils eine Zeile eingelesen wird. Diese Zeile wird nun intern in sogenannte ETL/ELT-Quellfelder zerlegt. Die Namen dieser ETL/ELT-Felder stammen hier aus der Kopfzeile und sind $Vorname, $Nachname und $Punkte.

Nun springen wir direkt in die Zieldaten (7), um dort mit unseren ETL/ELT-Quellfeldern unsere Zieldaten-Zeile aufzubauen.


images/download/attachments/131696646/1414-version-2-modificationdate-1692785702593-api-v2.png


Wir geben als Zieldaten-Typ ebenfalls CSV/Text an (8) und tragen den Namen und Pfad zur zu erzeugenden Datei (9) ein.

Anschließend markieren wir unsere ETL/ELT-Quellfelder (10) und schieben sie mit (11) nach rechts. Damit haben wir bereits die zu erzeugende Zieldaten-Zeile definiert: $Vorname,$Nachname,$Punkte

Klicken Sie nun auf (12). Es erscheint ein weiterer Dialog.


images/download/attachments/131696646/1415-version-1-modificationdate-1678094969221-api-v2.png


Lassen Sie (13) wie im Screenshot, wir haben sowieso nur eine Datenzeile in unserer Quelldatei, und klicken Sie dann auf (14).

Wie Sie in Ihrem Datei-System sehen werden, haben Sie bereits Ihre ersten Datei erzeugt.

Später können Sie in den Einstellungen noch Details wie Trennzeichen, Kopfzeile, Quoting-Zeichen verändern, aber damit wollen wir uns zuerst nicht aufhalten.

Import:

ETL_My_pipeline_1.obj

test_1_in.csv

Beispiel 2 (Eigene ETL/ELT-Felder)


In diesem Beispiel verwenden wir die Pipeline aus Beispiel 1 als Basis. Dort haben wir gezeigt, wie man aus den aus den Quelldaten eingelesenen ETL/ELT-Quellfeldern die Zieldaten aufbauen kann.

Jetzt wollen wir zeigen, wie man eigene ETL/ELT-Felder definieren und verwenden kann. Dazu wechseln wir in den entsprechenden Tab und legen über das Kontextmenü ein neues Feld an.


images/download/attachments/131696646/1457-version-1-modificationdate-1678226312905-api-v2.png


Als Wert möchten wir dem eigenen ETL/ELT-Feld den Wert des aus den Quelldaten stammenden ETL/ELT-Feldes Punkte geben und 20 addieren.


images/download/attachments/131696646/1458-version-1-modificationdate-1678227003063-api-v2.png


(1) Der Name unseres neuen, eigenen ETL/ELT-Feldes.

(2) Wir verwenden eine Funktion zur Berechnung des Feld-Wertes.

(3) Verschieben Sie die gewünschte Funktion, wie gewohnt, mit dem Pfeil nach rechts.

(4) Es gibt einen eigenen Parametertyp für ETL/ELT-Quellfelder. Anschließend können Sie das gewünschte Feld auswählen, hier Punkte.


images/download/attachments/131696646/1459-version-2-modificationdate-1692786019731-api-v2.png


Nun wechseln wir in den Zieldaten-Tab. Wir markieren unser eigenes ETL/ELT-Feld (5) statt des ETL/ELT-Quellfeldes Punkte (6) und verschieben es nach rechts, um es als dritten Wert unserer Zieldaten-Zeile zu verwenden (7).

Führen Sie einfachen einen Testlauf aus, wie in Beispiel 1 gezeigt, und sehen Sie sich das Ergebnis an.

Import:

ETL_My_pipeline_2.obj

test_1_in.csv

Beispiel 3 (ETL/ELT-Variablen)


Wir verwenden erneut die Pipeline aus Beispiel 1 als Basis. In der Zieldaten-Zeile verwenden wir nun aber statt eines ETL/ELT-Quellfeldes oder eines eigenen ETL/ELT-Feldes eine ETL/ELT-Variable. Dazu legen wir im entsprechenden Tab zuerst eine neue Variable an und geben ihr einen Wert.


images/download/attachments/131696646/1460-version-1-modificationdate-1678228919285-api-v2.png


Anschließend verwenden wir diese Variable in unserer Zieldaten-Zeile.


images/download/attachments/131696646/1461-version-2-modificationdate-1692786163030-api-v2.png


Führen Sie einen Testlauf aus, wie in Beispiel 1 gezeigt, und sehen Sie sich das Ergebnis an. Hinweis: In diesem Beispiel haben wir der Variable einen Initialwert gegeben, der Wert der Variable könnte aber z. B. auch von einem Workflow übergeben werden, wenn dieser die Pipeline startet. Siehe Abschnitt Variablen (ETL/ELT).

Import:

ETL_My_pipeline_3.obj

test_1_in.csv

Beispiel 4 (Kind-Task)


In diesem Beispiel wollen wir das Zusammenspiel zwischen Eltern- und Kind-Tasks zeigen.


images/download/thumbnails/131696646/1513-version-1-modificationdate-1679460538496-api-v2.png


Dazu verwenden wir den Eltern-Task my_task_1, in dem wir eine CSV-Datei mit mehreren Zeilen einlesen und keine Zieldaten erzeugen. Der Kind-Task my_task_1.1 wird dann so oft ausgeführt, wie die CSV-Datei Zeilen hat. Im Kind-Task ignorieren wir die Quelldaten und erzeugen jeweils eine Zieldaten-Zeile. In der Zieldaten-Zeile verwenden wir die ETL/ELT-Quellfelder aus dem Eltern-Task (auf die wir im Kind-Task Zugriff haben). Dadurch erzeugen wir so viele Zieldateien, wie die ursprüngliche Quelldatei im Eltern-Task Zeilen hat.

Für die Namen der erzeugten Dateien verwenden wir eine Counter-Variable, die wir in den Bedingungen der Zieldaten des Kind-Task erhöhen (sehen Sie sich das Konstrukt dort an).

Führen Sie einen Testlauf aus, wie in Beispiel 1 gezeigt, und sehen Sie sich das Ergebnis an.

Import:

ETL_My_pipeline_4.obj

test_2_in.csv

Beispiel 5 (Geschwister-Task, Zwischenablage)


In diesem Beispiel wollen wir das Zusammenspiel zwischen Geschwister-Tasks zeigen.


images/download/thumbnails/131696646/1521-version-1-modificationdate-1679542761794-api-v2.png


In Task my_task_1 lesen wir eine CSV-Datei ein, erzeugen keine Zieldatei und schreiben alle ETL/ELT-Quellfelder in die Zwischenablage, weil wir diese im Geschwister-Task my_task_2 verwenden möchten, aber dort keinen direkten Zugriff darauf haben. Im Geschwister-Task my_task_2 lesen wir dann in den Quelldaten die Zwischenablage aus und erzeugen daraus dann die Zieldatei.

Führen Sie einen Testlauf aus (mit 3 Zeilen), wie in Beispiel 1 gezeigt, und sehen Sie sich das Ergebnis an.

Import:

ETL_My_pipeline_5.obj

test_2_in.csv

Beispiel 6 (Praxisbeispiel Währungsumrechnung)


In diesem Beispiel lesen wir eine Datei mit einer Liste von Auftragspositionen ein und erzeugen daraus eine identische Datei, in der aber der Positionspreis von Euro in US-Dollar umgerechnet wird. Folgend die eingelesene Datei.


./webapps/root/upload/currency_in.csv
item_number,price,quantity
102788,17.99,2
116700,4.49,3
210098,23.77,1


images/download/attachments/131696646/1563-version-2-modificationdate-1692787371152-api-v2.png


(1) Im ersten Task holen wir uns lediglich den Umrechnungskur von Euro in US-Dollar.

(2) Dazu verwenden wir eine Funktionskette in den Bedingungen. Wir holen den Umrechnungskurs per HTTP-Call, der in diesem Beispiel nur eine Zufallszahl abruft. Diesen Wert speichern wir dann in einer ETL/ELT-Variable.


images/download/attachments/131696646/1564-version-1-modificationdate-1684992388380-api-v2.png


(3) In einem zweiten Task lesen wir dann die Eingangsdatei ein. Zudem definieren wir ein eigenes ETL/ELT-Feld. Der Wert dieses Feldes ist der eingelesene Positionspreis, multipliziert mit dem Umrechnungskurs in unserer ETL/ELT-Variable.


images/download/attachments/131696646/1565-version-2-modificationdate-1692787876445-api-v2.png


(4) In den Zieldaten verwenden wir dann die ETL/ELT-Eingangsfelder, für den Preis stattdessen unser eigenes ETL/ELT-Feld.


Import:

ETL_My_pipeline_6.obj

currency_in.csv

Beispiel 7 (Praxisbeispiel Dubletten-Behandlung)


Nehmen wir an, wir möchten eine CSV-Datei einlesen und sicherstellen, dass wir evtl. darin enthaltene Dubletten entfernen, bevor wir in ein beliebiges Ziel schreiben (im Beispiel in eine andere CSV-Datei).


ID,Name
1,Peter
2,Paul
1,Peter
3,Michael

Wie zu sehen ist, gibt es in der Beispiel-Datei zwei Einträge mit derselben ID. Um Dubletten dieser Art zu bereinigen, gehen wir folgendermaßen vor.


images/download/attachments/131696646/1708-version-1-modificationdate-1692869826906-api-v2.png


Wir definieren für jede zu schreibende Zeile Bedingungen (1), die uns sagen, ob diese Zeile eine ID enthält, die bereits geschrieben wurde. In der dort definierten Funktionskette, geben wir true zurück, wenn die ID noch nicht in einer internen ID-Liste vorhanden ist und fügen dann die ID der Liste hinzu. Ist die ID bereits in der Liste vorhanden, geben wir false zurück.

Bei true greift schlicht das primäre Datenziel (2) und wir schreiben dorthin die eingelesene Zeile (3).

Bei false führen wir eine separate Aktion (4) für diese Zeile aus, die über (5) konfiguriert wird (siehe folgenden Screenshot), d. h. das primäre Datenziel greift dann nicht.


images/download/attachments/131696646/1709-version-1-modificationdate-1692869826908-api-v2.png


Wir definieren in (6) das sekundäre Datenziel, in das wir stattdessen die eingelesene Zeile (7) schreiben.

Unsere bereinigten Daten landen also in der Zieldatei data_out.csv und Dubletten landen in der Zieldatei duplicates_out.csv.


Import:

ETL_My_pipeline_7.obj

data_with_duplicates.csv


Falls wir die eingelesenen Daten in eine Datenbank schreiben, gibt es eine elegantere Lösung, wenn die ID dort der Primary Key ist. Beim Versuch eine Zeile mit einer ID in die Datenbank zu schreiben, die dort bereits vorhanden ist, wird es zu einem SQL-Fehler kommen. Diesen Fehler können wir mit der Fehlerbehandlung abfangen und dort analog eine separate Aktion ausführen.


images/download/attachments/131696646/1710-version-1-modificationdate-1692870417828-api-v2.png

Beispiel 8 (Praxisbeispiel: Direkter Bulk-Insert Datei → Datenbank)


In diesem Beispiel wird gezeigt, wie Sie Daten direkt aus einer Textdatei in eine Datenbank schreiben können. Dies bringt einen deutlichen Geschwindigkeitsvorteil und kann verwendet werden, wenn keine Änderungen an den Daten vorgenommen werden müssen. Die in diesem Beispiel verwendete Datenbank ist MySQL (für andere Datenbanken beziehen Sie sich bitte auf die Dokumentation des jeweiligen Datenbankherstellers für ähnliche Funktionen). Hinweis: Siehe auch https://dev.mysql.com/doc/refman/8.0/en/load-data.html.


images/download/attachments/131696646/1575-version-1-modificationdate-1701747574919-api-v2.png

images/download/attachments/131696646/1576-version-1-modificationdate-1701747574932-api-v2.png


(1) ETL/ELT-Feld, das den Datei-Pfad und -Namen enthält.

(2) Verwendung des ETL/ELT-Feldes aus (1).


Analog kann eine XML-Datei verarbeitet werden. Hinweis: Siehe auch https://dev.mysql.com/doc/refman/8.0/en/load-xml.html.


images/download/attachments/131696646/1580-version-1-modificationdate-1701747574950-api-v2.png