In einem Blog­bei­trag Ende des letz­ten Jah­res haben wir einen Über­blick der ver­schie­de­nen Prin­zi­pien von Tal­end gege­ben. Der Fokus lag hier auf den vie­len Frei­hei­ten, die die­ses Tool bie­tet. Wei­ter­hin ist am Anfang die­ses Jah­res ein Blog­bei­trag erschie­nen, der die Vor­teile eines gut gepfleg­ten Java-Code Repo­si­to­rys beschreibt und außer­dem eine Mög­lich­keit dar­stellt dyna­mi­sche Daten­bank­ab­fra­gen zu definieren.

Der heu­tige Bei­trag stellt das Herz­stück vie­ler Tal­end Jobs in den Mit­tel­punkt: die viel­sei­tig ein­setz­bare Kom­po­nente tMap. Diese Kom­po­nente ver­eint nicht nur andere native Kom­po­nen­ten, wie bei­spiels­weise tJoin und tFil­ter­Row mit­ein­an­der, son­dern lie­fert auch wich­tige Fea­tures, die sonst keine andere Kom­po­nente bedie­nen kann.

Rei­hen­folge und Durch­rei­chen der Zeilen

Wie viele andere Tal­end Kom­po­nen­ten auch, ändert die tMap die Zei­len­rei­hen­folge nicht und gibt die ein­zel­nen Zei­len direkt zur nächs­ten Kom­po­nente wei­ter. Bei einem simp­len Map­ping mit nur einem Input, Out­put und mit einer oder meh­re­ren tMaps dazwi­schen, kön­nen die Daten schon im Ziel geschrie­ben wer­den, obwohl der Input noch nicht alle Zei­len ein­ge­le­sen hat. Diese Eigen­schaft ist vor allem bei gro­ßen Daten­men­gen enorm vor­teil­haft, da die Gesamt­menge an Daten nicht im Arbeits­spei­cher vor­ge­hal­ten wer­den muss und wei­ter­hin par­al­lel gele­sen und geschrie­ben wer­den kann.

Fil­tern und Duplizieren

Die Anzahl der Zei­len am tMap-Aus­gang muss nicht zwangs­läu­fig der Anzahl am Ein­gang ent­spre­chen. Zum einen las­sen sich Fil­ter­be­din­gun­gen defi­nie­ren, die die Anzahl der Zei­len ver­rin­gern, und zum ande­ren las­sen sich die Zei­len auch dupli­zie­ren. Die tMap bie­tet die Mög­lich­keit meh­rere Aus­gangs­ströme zu defi­nie­ren (ana­log der Infor­ma­tica Kom­po­nente Rou­ter). Sind zum Bei­spiel 2 Aus­gangs­ströme defi­niert, die jeweils keine Fil­ter­be­din­gun­gen haben, so ist die Anzahl der Zei­len am Aus­gang der tMap zusam­men­ge­zählt dop­pelt so hoch.

Talend Data Integration Die tMap Komponente Bild1
Abbil­dung 1 tMap Beispieljobs

Die­ser Bei­spiel­job zeigt die ver­schie­de­nen Mög­lich­kei­ten die Zei­len­an­zahl mit Hilfe der tMap zu mani­pu­lie­ren: Im ers­ten Fall wird die Zei­len­an­zahl nicht mani­pu­liert. Die Sor­tie­rung bleibt immer erhal­ten. Im zwei­ten Fall ist in der tMap ein Fil­ter defi­niert und 20 Daten­sätze wer­den zurück­ge­hal­ten. Im drit­ten Fall sind zwei Aus­gänge (output_1 und output_2) defi­niert. Diese besit­zen in die­sem Bei­spiel beide die volle Anzahl an Zei­len, könn­ten jedoch auch spe­zi­fisch gefil­tert wer­den. Im vier­ten und letz­ten Fall sind eben­falls zwei Aus­gänge defi­niert, die jedoch in einem Aus­gang zusam­men­ge­fasst wurden.

Sol­len diese bei­den Aus­gangs­ströme in einem Aus­gangs­strom ver­eint sein, bie­tet die tMap die Mög­lich­keit „joi­ned out­put tables“ als out­put zu defi­nie­ren. Die­ser joi­ned out­put ist im SQL Sinne nicht zu ver­wech­seln mit einem JOIN, son­dern ent­spricht einem UNION ALL. Die­ses Fea­ture mag jeman­den mit ETL Erfah­rung ohne viel Erfah­rung mit Tal­end nicht beson­ders vor­kom­men, es ist aber ent­schei­dend, da dies in Tal­end die ein­zige Mög­lich­keit ist, einen geschlos­se­nen Daten­fluss-Kreis zu erstel­len ohne die Gesamt­menge zwischenzuspeichern.

Klei­ner Exkurs geschlos­se­ner Kreis: Es ist in Tal­end nicht mög­lich wie in IBM Data­s­tage oder Infor­ma­tica Power Cen­ter nach dem Auf­tren­nen des Daten­stroms diese auf direk­tem Wege wie­der zu ver­ei­nen. Es ist weder mög­lich per tUnion die Daten­ströme ein­fach anein­an­der anzu­hän­gen, noch per tJoin zu ver­ei­nen, siehe unse­ren Blog­bei­trag Tal­end Self-Join. Inner­halb der tMap Kom­po­nente kön­nen jedoch belie­big viele Aus­gangs­ströme defi­niert wer­den (Auf­tei­len des Daten­stroms), die gleich­zei­tig mit Hilfe eines joi­ned out­puts direkt wie­der zusam­men­ge­führt wer­den (im Sinne von UNION ALL).

Tabel­len pivotieren

Über die oben vor­ge­stellte joi­ned out­put table ist es mög­lich eine Tabelle zu pivo­tie­ren bezie­hungs­weise zu nor­ma­li­sie­ren. Ent­hält das Schema bei­spiels­weise die zwei Spal­ten ADRESSE1 und ADRESSE2 und diese Spal­ten sol­len in die ein­zelne Spalte ADRESSE (jedoch in zwei Zei­len) ver­eint wer­den, so muss die tMap ver­wen­det wer­den: Es wer­den zwei out­puts erstellt: „out_adresse1“ und „out_adresse2 joi­ned with out_adresse1“. Nun muss ledig­lich noch jeweils eine der Spal­ten ADRESSE1 bezie­hungs­weise ADRESSE2 mit jeweils einem out­put ver­bun­den wer­den. Optio­nal kann ein Fil­ter je out­put defi­niert wer­den, ob eine Zeile aus­ge­ge­ben wird, falls das Adress­feld nicht gefüllt ist.

Die Kom­po­nente tNor­ma­lize bie­tet eine wei­tere Option einen Daten­satz zu nor­ma­li­sie­ren. Hier müs­sen jedoch zwangs­läu­fig die zu nor­ma­li­sie­ren­den Spal­ten in einer Spalte, getrennt mit einem frei wähl­ba­ren Sepa­ra­tor, defi­niert sein. Nume­ri­sche Daten müss­ten so erst zu einem String zusam­men­ge­setzt wer­den, um sie nach der tNor­ma­lize wie­der von einem String zurück zu dem ursprüng­li­chen Daten­typ kon­ver­tie­ren zu müs­sen. Da lie­fert die oben beschrie­bene Methode mit der tMap die bes­sere Lösung.

Tabel­len joinen

Die tMap kann wei­ter­hin zum Joinen (SQL JOIN) meh­re­rer Tabel­len ver­wen­det wer­den. Es kön­nen belie­big viele lookup rows in die tMap füh­ren, die per cross join, left join oder inner join an den Daten­strom ange­fügt wer­den kön­nen. Die lookup Daten­menge wird beim Aus­füh­ren des Jobs vor dem Start des füh­ren­den Daten­stroms auf­ge­baut und im Spei­cher gehal­ten. Hier ist also bei gro­ßen Daten­men­gen Vor­sicht gebo­ten. Wer­den in einem Daten­strom meh­rere lookup rows auf­ge­baut, ist even­tu­ell die Option in der tMap inter­es­sant alle loo­kups gleich­zei­tig auf­zu­bauen. Ansons­ten wird sequen­zi­ell geladen.

Inter­es­sant ist hier die Option an dem tMap Aus­gang catch inner join rejects: An einem tMap Aus­gang lässt sich die Option akti­vie­ren alle inner join rejects aus­zu­ge­ben. Dies ent­spricht im SQL Sinne ein

SELECT A.KEY, B.KEY
    FROM EMPLOYEE A
LEFT JOIN MANAGER B
    ON A.KEY=B.KEY
WHERE B.KEY IS NULL -- get all (inner join) rejects, i.e., all employees 
                       without managers

Diese Option ist zum Bei­spiel für ein typi­sches Ende einer ETL Stre­cke für den insert-Strang in eine Tabelle sinn­voll, in der zuvor geprüft wird, ob es die Daten­sätze schon im Ziel gibt. Zeit­gleich kann in der tMap ein (update-)Ausgang mit den getrof­fe­nen Join Zei­len exis­tie­ren; eine Kom­bi­na­tion aus bei­den Aus­gän­gen ist über joi­ned out­put eben­falls möglich.

Expres­si­ons

Die tMap ist hori­zon­tal auf­ge­teilt in drei Berei­che: Links ist Platz für den Haupt­ein­gangs­strom und opi­onal für wei­tere lookup Tabel­len. Auf der rech­ten Seite befin­den sich die schon aus­führ­lich beschrie­be­nen Aus­gänge. In der Mitte ist jedoch nicht nur Platz für die Dar­stel­lung der Ver­bin­dun­gen vom Ein­gang zum Aus­gang, es kön­nen wei­ter­hin belie­big viele Varia­blen defi­niert wer­den. Diese Varia­blen ver­hal­ten sich genau so wie die Infor­ma­tica Kom­po­nente Expres­si­ons: Pro Zeile im Ein­gang wer­den die Varia­blen “von oben nach unten” gela­den. Es gibt drei Hauptanwendungsfälle:

1. Bes­sere Les­bar­keit und Wart­bar­keit, wenn auf expres­si­ons im Aus­gang ver­zich­tet wird

Selbst kleinste Ände­run­gen an einer Spalte, sei es nur eine Daten­typ­kon­ver­tie­rung, kön­nen zu Pro­ble­men füh­ren. Wenn diese Trans­for­ma­tion nur in der expres­sion im Aus­gang ver­steckt ist, kann sie leicht über­se­hen wer­den. Wenn jedoch in den Varia­blen expli­zit zum Bei­spiel die Spalte column1 in die Varia­ble Var.column1_not_null über­geht und diese dann dem Aus­gang über­ge­ben wird, ist die Ände­rung direkt offensichtlich.

2. Bes­sere Les­bar­keit und Wart­bar­keit bei kom­ple­xe­ren bezie­hungs­weise ver­schach­tel­ten Expressions

Kom­plexe Trans­for­ma­tio­nen, die auf meh­rere Ein­zel­schritte auf­ge­teilt wer­den kön­nen, kön­nen durch die Ver­wen­dung von Varia­blen bes­ser wart­bar imple­men­tiert wer­den. Das naming ist hier ent­schei­dend. Wei­ter­hin kön­nen ein­zelne Varia­blen in Fol­ge­schrit­ten wie­der­ver­wen­det wer­den. Wird bei­spiels­weise input_row.column5 viel­fach mit einer Trans­for­ma­tion benö­tigt, ist die Ver­wen­dung von

Var.column5_not_null_default

ein­fa­cher zu ver­wen­den als bei­spiels­weise an mehr­fa­chen Stel­len den etwas sper­ri­gen Ausdruck 

(input_row.column5 == null || input_row.column5.equals("") ? "default_saracus_value": input_row.column5)

zu ver­wen­den.

3. Zugang zu der vor­an­ge­gan­ge­nen Zeile, indem auf Varia­blen zuge­grif­fen wird, die “wei­ter unten” defi­niert sind

Durch das Auf­ru­fen von Varia­blen kann auf die Infor­ma­tion der vor­an­ge­gan­ge­nen Zeile zuge­grif­fen wer­den, da die Varia­blen nicht bei jeder neuen Zeile erneut initia­li­siert wer­den, son­dern der Reihe nach neu gesetzt wer­den. Diese Eigen­schaft ist nur dann sinn­voll aus­zu­nut­zen, wenn die Ein­gangs­da­ten sor­tiert sind und bei­spiels­weise zu jeder Gruppe eine Infor­ma­tion gesucht wird, oder bei­spiels­weise bei einer Zeit­reihe der Bezug zur vor­an­ge­gan­gen Zeile her­ge­stellt wird ana­log der SQL nati­ven win­dow-Funk­tio­nen lag() oder lead().

Fazit

Die tMap ist der fast-alles-Kön­ner unter den Tal­end Kom­po­nen­ten. Auch wenn ein­zelne Auf­ga­ben mit den spe­zi­el­le­ren Kom­po­nen­ten wie tJoin, tFil­ter­Row, tFil­ter­Co­lumn, tJa­va­Row oder tRe­pli­cate durch­ge­führt wer­den kön­nen, grei­fen viele Ent­wick­ler aus Gewohn­heit direkt zur tMap. Das bringt vor allem den Vor­teil der Fle­xi­bi­li­tät direkt zwei oder mehr Ope­ra­tio­nen in einer Kom­po­nente wie zum Bei­spiel “join loo­kuptable and create insert and update flow” durch­zu­füh­ren. Diese Anfor­de­rung benö­tigt andern­falls drei oder vier Kom­po­nen­ten. Letzt­end­lich macht die Option joined_output_tables zu erstel­len die tMap unabdingbar.

Hat Ihnen die­ser Bei­trag in unse­rem saracus Blog gefal­len? Dann schrei­ben Sie uns doch und geben Feed­back. Haben Sie einen Wunsch für ein zukünf­ti­ges Thema? Geplant ist ein Bei­trag zu ver­schie­den Lade­stra­te­gien, ein Bei­trag wie sich das Sor­tie­ren von Daten aus­nut­zen lässt und ein Bei­trag zu Teststrategien.