Erstellen Sie mehrere Ausgabe-Dateien in Talend basiert auf einer Spalte aus einer SQL-Eingabe
Habe ich die Notwendigkeit der Erstellung mehrerer Ausgabe-Dateien basierend auf einem Wert (Spalte) aus einer sql-Eingabe in Talend Open Studio.
Meine tMSSQLInput gibt etwa 50.000 Zeilen, in denen, wo eine der Säulen ist die building_name
Gebäude Ein
Gebäude B
Gebäude C
....
Also alle Zeilen, deren Wert "Ein" sollte in eine excel-Datei mit Namen "buildingA.xls" alle Zeilen "Gebäude B" sollte in eine excel-Datei mit Namen "buildingB.xls" und so weiter.
Ich habe versucht, zu verwenden tLoop oder tForEach zusammen mit tIterateToFlow aber ich bin nicht sicher, ob ich weiß, wie es zu implementieren.
Vielen Dank im Voraus.
Ich würde ein select-distinct-countName schließen Sie es dann wie: tMSSQLInput -> flowtoIterate -> teiljob über. Jetzt die teiljob über die würde der filter für die Zeilen. E. g. die teiljob über schaffen würde 1 Datei basierend auf dem input-parameter. Wenn Sie 10 Gebäude die teiljob über die wird 10 mal aufgerufen. Im teiljob über die Sie verwenden können, tMSSQLInput -> tFileOutputExcel. Ich würde verwenden, ein teiljob über, becase dynamisch ändernden Dateinamen manchmal Probleme verursacht, wenn Sie diese mit Durchlaufen.
InformationsquelleAutor Viriato | 2014-09-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gabriele ' s Antwort sieht ziemlich gut zu mir.
Jedoch, wenn Sie sich in einer situation, wo Sie haben eine riesige Menge von Daten über eine Menge von Gebäuden zu dem Punkt, wo Sie speichern können einzelne Gebäude Reihen im Wert von Daten im Speicher aber nicht alles, dann wäre ich geneigt zu verwenden, die einen etwas anderen Ansatz.
In diesem Beispiel job, ich bin mit MySQL-Datenbank-Komponenten, nur weil ich zufällig eine lokale MySQL-Datenbank, aber alles über dieser Auftrag gilt für Oracle oder MS SQL-Server sowie:
Ganz am Anfang öffnen wir eine Verbindung zu der Datenbank mit einem tMySqlConnection Komponente in diesem Fall. Die restlichen 2 Datenbank-Komponenten (die tMySqlInput und die tMySqlRow), verwenden Sie das shared connection details.
Beginnen wir mit greifen eine Liste der Gebäude, die in der Datenbank mithilfe der folgenden Abfrage in der tMySqlInput:
Dieser kehrt alle unterschiedliche Gebäude.
Wir dann Durchlaufen Sie jedes Gebäude, das ermöglicht es uns, halten die nur die Datensätze für das jeweilige Gebäude in den Speicher für den rest der Arbeit.
Wir dann mit einem tMySqlRow Komponente zu ziehen, die Daten für das jeweilige Gebäude die iteration mit einer vorbereiteten Anweisung. Die Beispiel-Abfrage, die ich verwende sieht so aus:
- Und dann konfigurieren wir die vorbereitete Anweisung in den erweiterten Einstellungen:
Wo ich gesagt habe, dass der erste parameter (Parameter-Index = 1) ist das Gebäude Wert, den wir abgerufen haben, und die tFlowToIterate hilfreich geschoben, um die globalMap für uns, damit wir Sie von dort abruft mit
((String)globalMap.get("row6.building"))
in diesem Fall (es ist die "Bau" - Spalte wurde in die row6 flow).Wenn Sie mit einer vorbereiteten Anweisung die Sie brauchen, um die Daten abzurufen, die als ein Datensatz-Objekt, so dass Sie wollen zu setzen, das schema der tMySqlRow etwa so:
Und dann werden wir analysieren es mit Hilfe der tParseRecordSet Komponente:
Mit einem schema zu passen, in diesem Beispiel:
Dann müssen wir iterieren über diesen Satz von Daten, anfügen an eine entsprechend benannte CSV-Datei. Dazu verwenden wir eine andere tFlowToIterate Komponente und nehmen Sie eine etwas lästige Umweg über eine tFixedFlowInput Komponente zu Lesen, jeder Datensatz Daten aus der globalMap vor der übergabe an die tFileOutputDelimited:
Und dann schließlich wir Anhängen in eine CSV-benannt nach dem Gebäude:
Beachten Sie die append-Kontrollkästchen aktiviert ist, da sonst jeder iteration der job überschreibt die Vorherige. Wir haben auch den Namen der Datei durch den Wert in der Spalte Gebäude.
Gabriele erwähnt, Wenn Sie Ihre Daten gerne in Erinnerung zu allen Zeiten Sie können die Arbeit vereinfachen, indem Sie, anstatt nur zu Lesen, Ihre Daten in eine tHashOutput Komponente und Anschließendes filtern der Daten in den hash:
Starten wir durch das Lesen der Daten in eine tHashOutput Komponente, dann hält die Daten im Speicher während der Arbeit. Talend manchmal verbirgt diese Komponenten für einige ungerade Grund, aber Sie können Sie wieder aktivieren Sie, indem Sie Sie zurück in den Projekt-Eigenschaften -> Designer -> Palette Einstellungen:
Nächstes Lesen wir die Daten wieder in den hash mit ein tHashInput Komponente (mit dem vorherigen verbunden tHashOutput Komponente - vergessen Sie nicht, fügen Sie die gleichen schema, um die tHashInput Komponente) und dann mit einem tAggregateRow-Komponente und der Gruppe von "building", um effektiv zu nehmen, eine deutliche der Gebäude Werte:
Wir dann Durchlaufen Sie die unterschiedlichen Werte für "Gebäude" mit der tFlowToIterate und filtern Sie dann den hash (gelesen in einem zweiten mal) durch die Gebäude Wert derzeit Durchlaufen:
Und schließlich, machen wir mal wieder sicher zum Anhängen an eine Datei benannt nach dem Wert in der Spalte Gebäude:
InformationsquelleAutor ydaetskcoR
Ich denke, es ist besser, es zu tun wortreich in einem zwei-Schritte-job
Ich würde entwerfen einen job wie diesen
Lassen Sie mich erklären, was Los ist
tCacheOut
, auf Talend Exchange, ist eine gute Komponente, aber out-of-the-boxtHashInput
/tHashOutput
wird den job zu erledigen, auch) - das ist für das Abfragen der DB nur einmal, aber wenn die Leistung nicht Voraussetzung, Sie können trig mehrere Abfragen und vermeiden Sie die Verwendung der Speicher-PuffertAggregateRow
gegen den Bau Spalte)my_building
"globalMap.get("my_building")
innen Ihre FilterbedingungenglobalMap.get("my_building")
einstellen den Dateinamen.InformationsquelleAutor Gabriele B
Einen Weg, dies zu tun ist mit einem Prozess wie:
tMySqlInput-->tFlowToIterate-->tFixedFlowInput-->tFileOutputDelimited.
Hier in tFlowToIterate (Sie können fügen Sie Ihren Schlüssel - wie der Dateiname wird der Wert aus einer Spalte in dem schema des tMySqlInput)
In tFileOutputDelimited Sie können diese
(String)glotbalMap.get("FileName")
um eine Datei zu erstellen namens Pfad, wo diese Datei name kommt für jede Zeile von tMySqlInput.InformationsquelleAutor garpitmzn