Self-Joins mit Talend Enterprise Data Integration

Was ist Talend? Talend als Data Integration Tool

Talend bietet mit Open Studio for Data Integration (Open-Source-Version) und Talend Enterprise Data Integration (Enterprise-Version) zwei Tools zur Datenintegration an. Die freie Variante eignet sich für kleine Projekte mit geringeren Ansprüchen an die Integrationslösung oder dem Wunsch eigenen Code zu entwickeln. Die Enterprise-Version bringt zusätzliche Komponenten und mehr Konnektoren mit, Deployments können automatisiert ausgeführt werden und mit dem Talend Administration Center gibt es die Möglichkeit die Ausführung der Talend Jobs zu planen und zu überwachen.  Für größere Unternehmen bietet sich eine zusätzliche Verwendung von Talend Big Data Integration an, welches zusätzliche Komponenten zur Verarbeitung von Big Data wie MapReduce, Hadoop, HBase und Hive mitbringt. Mit Talend Data Fabric steht eine einheitliche Cloudplattform zur Verfügung die Data Integration, Big Data Integration und zusätzliche Talend Services umfasst.

Im Gegensatz zu anderen ETL-Tools unterscheidet sich Talend von den üblichen Software-Lösungen, da keine Metadaten, die sich nur mit einem proprietären System ausführen lassen, generiert werden, sondern nativer Java-Code, welcher lediglich einen Java-Compiler zum Ausführen voraussetzt. Die große Stärke von Talend liegt darin, dass im Gegensatz zu anderer Datenintegrationssoftware, das Erstellen von eigenen spezifischen Objekten mit Java und die Integration in Talend ohne Probleme möglich sind. In diesem Blog-Beitrag soll gezeigt werden, wie eine Standardaufgabe in ETL-Prozessen, der Self-Join, welcher nicht durch ein Standardverfahren in Talend vorgesehen ist, umgesetzt werden kann.

Der Self-Join:

Eine der häufigsten Aufgaben in der Datenverarbeitung ist das Verknüpfen von Informationen aus mehreren Tabellen – ein Prozess der als Join bezeichnet wird. In der Regel werden dabei Daten aus unterschiedlichen Tabellen kombiniert, allerdings kann es auch erforderlich sein, dass Einträge aus der gleichen Tabelle gejoint werden. Dies ist zum Beispiel notwendig, wenn eine Zeile mit allen Zeilen oder einer Teilmenge der Zeilen der gleichen Tabelle verglichen oder angereichert werden soll.

Ein Self-Join wird somit genutzt, um Beziehungen der Daten innerhalb einer Tabelle zu finden. Dies ist ein übliches Vorgehen in ETL-Prozessen und wird von den meisten ETL-Tools unterstützt. Allerdings sind Self-Joins nicht direkt in Talend integriert, sodass sie sich nur mit Umwegen durchführen lassen.  Üblicherweise werden Joins in Talend mit der tMap Komponente realisiert, jedoch ergibt sich das Problem, dass für einen Join eine unabhängige Lookup-Tabelle benötigt wird. In Talend ist es nicht möglich die Lookup-Tabelle aus dem gleichen Datenstrom zu erzeugen. Eine Möglichkeit aus einem Datenstrom zwei unabhängige Datenströme zu erzeugen ist die Verwendung der tHashOutput Komponente. Mit dieser Komponente wird der Datenstrom zwischengespeichert und lässt sich mittels tHashInput wieder auslesen. Nachdem beide Datenströme vollständig in den Cache geschrieben wurden, kann im folgenden Subjob der Self-Join durchgeführt werden, indem zwei tHashInput Komponenten als Input für die tMap zur Verfügung stehen. Dies führt allerdings dazu, dass die Tabelle zweifach in den Speicher geschrieben wird. Dies kann zum einen zu Speicherengpässen und zum anderen zu Performance-Problemen führen.

Abbildung 1: Self-Join in Talend mit Zwischenspeichern der Datenströme

 

In Abbildung 1 ist die mögliche Lösung des Problems in einem Talend-Job abgebildet, indem durch eine tMap zwei Datenströme erzeugt werden, welche durch die tHashOutput-Komponenten in den Cache geschrieben werden. Nach vollständigem Durchlaufen des ersten Teils des Jobs (OnSubjobOK) werden in einem nächsten Schritt die beiden Tabellen zunächst über die tHashInput-Komponenten wieder eingelesen und mit einer tMap gejoint. Auf Grundlage einer vorher definierten Bedingung wird ein Flag auf bestimmte Zeilen, die die Bedingung erfüllen gesetzt. Durch das für die betroffenen Gruppen gesetzte Flag (Self-Join mit Bedingung) werden bestimmte Zeilen ermittelt, auf welche in der darauffolgenden tMap mit einer if-Bedingung reagiert werden kann und der Datenstrom, entsprechend der gesetzten Flags, mit Daten aus einem Flatfile angereichert wird.

In Informatica PowerCenter lässt sich der Self-Join durchführen, indem zwei Datenströme, die aus der gleichen Quelle stammen und bereits im Source-Qualifier sortiert wurden als geordneter Input in ein Objekt mit einer Join-Bedingung übergeben werden.  Dies lässt sich nicht in Talend nachbilden, da wie bereits erklärt eine unabhängige Lookup-Tabelle für Joins in Talend benötigt wird, die nicht aus der gleichen Quelle bezogen werden darf. Da der Umweg über das Zwischenspeichern der Daten in Informatica entfällt, ist diese Lösung Ressourcen schonender als die vorgestellte Talend-Lösung. Das PowerCenter Mapping ist in Abbildung 2 dargestellt.

Abbildung 2: Self-Join in PowerCenter

Eine effizientere Lösung in Talend ergibt sich, wenn der Self-Join auf Datenbankebene durchgeführt werden kann, wie in Abbildung 3 dargestellt. Hier kann eine Ermittlung der Gruppen bereits auf Datenbankebene durch ein SQL-Statement erfolgen. Dabei wird auch hier ein Flag auf Grundlage der festgelegten Bedingung gesetzt.

Abbildung 3: Self-Join auf Datenbank-Ebene

Der Vorteil liegt darin, dass nun keine zwei Tabellen in den Cache-Speicher des Talend-Servers geschrieben werden müssen, sondern der Self-Join effizient auf Datenbankebene durchgeführt wird.

Problematisch wird es, wenn der Self-Join nicht zu Beginn des Jobs durchgeführt werden kann. Dann kann es sich anbieten den Job aufzuteilen und zunächst ein Zwischenergebnis in einer temporären Tabelle zu persistieren, die in dem zweiten Talend-Job für den Self-Join genutzt werden kann. Ist der erste Talend Job zum Beispiel mittels ELT- oder tDBRow Komponenten komplett pushdown fähig, können die Daten im ersten Teil des Jobs komplett auf der Datenbank verbleiben. Dies stellt eine effiziente Lösung dar, da bei diesem Verfahren die Daten nur für den notwendigen Schritt zur Anreicherung der Daten von externen Quellen geladen werden.

Fazit:

Es ist möglich die fehlende Funktion des Self-Joins in Talend zu umgehen, sofern es eine Option ist ihn auf Datenbank-Ebene durchzuführen. Sollte dies nicht möglich sein, ist es denkbar den Job neuzugestalten, sodass auf einen Self-Join verzichtet werden kann. Auch wenn in der Regel ETL-Tools Möglichkeiten von Self-Joins standardmäßig mitbringen ist es kein großer Nachteil, dass Talend dies nicht vorsieht, da in der Regel Joins auf Datenbank-Ebene performanter durchgeführt werden können. Grundsätzlich ist Talend ein interessantes Tool zur Datenintegration, da Talend durch das offene Java-Framework und die Anbindungen an viele Open-Source-Projekte, wie Git, JUnit und Apache Maven sehr flexibel ist.