/ tutoriaux

Talend - Passage de variables entre jobs

Nous allons vous présenter quelques manières pour passer des valeurs / paramètres entre des jobs parents et enfants dans l'ETL Talend. nous utilisons ici Talend Open Studio en version communautaire.

1. Par variables de contexte

1.1 Mise en place du job parent

Nous avons ici un Job parent qui génère des lignes et qui va les passer à un job enfant pour traitement (enfin, affichage par un logger).

Nous commençons par créer notre job parent avec un générateur de lignes et un logger:
generateur01
Le générateur contient un schema simple avec un id, un nom et une notation.
generateur02
Nous pouvons éxecuter le job pour s'assurer que les lignes sont bien générées et nous obtenons:
premier_test

Nous allons ensuite passer les lignes une à une à un job enfant. Pour cela, nous intercalons un tJavaRow définis comme suis
javaRow_contenu
et nous envoyons l'output à un sous-job.
parent_job

Avant de configurer la tâche RunJob, nous devons déjà créer le sous-job.

1.2 Mise en place du job enfant

Avant de créer le job enfant, nous allons sauvegarder le schema des données que nous transitons dans le job parent.
Pour cela, éditez par exemple le tLogRow du parent et ouvrez le built-in schema, puis sauvegardez le.
parent04
Celui-ci sera désormais dans les Generic Schemas dans vos Metadata.

Il faut créer un nouveau job et y ajouter un tFixedFlowInput et un logger.
firstchild01

Nous créeons également un Contexte qui reprend la même définition que le schema précédent (il serait sympa de pouvoir générer le schema à partir du Contexte)
parent05
et nous glissons le contexte créé dans le sous-job.
firstchild02

Dans la définition du fixedFlowInput, nous allons redonner le schema enregistré précedemment et fixer les valeurs à celles du contexte.
firstchild03

1.3 Liaison

Nous pouvons revenir au job parent et terminer de parametrer la tâche sous-job. Pour cela, dans les "Context Param", on ajoute ceux défini dans le sous-job et la valeur est celle transmise par le tJavaRow.
parent06

Vous pouvez ensuite tester le tout en faisant un Run du parent.
Vous obtenez dans le logger du parent la liste des lignes,
parent09
et pour chacune le job enfant affiche (heureusement) les mêmes lignes.
parent10

Cette méthode est simple à mettre en oeuvre seulement peut devenir pénible quand il y a trop de paramètres à passer.

2. Par inversion de descendance

L'idée de cette méthode est d'appliquer le traitement du parent dans l'enfant et de remonter les résultats par un tBufferOutput.

En reprenant notre exemple, le générateur est du coup déplacé dans le job enfant et les résultats sont envoyés dans un buffer output.
firstchild20

Le parent devient un appel, en premier, du job enfant et ensuite le traitement des données reçues (ici juste un logger).
parent20

Et quand on execute le job parent, on affiche bien les mêmes données dans l'enfant et dans le parent.
parent21

3. Par une seule variable de contexte

Un inconvénient de la première méthode est d'avoir une multitude de variables de contexte.
Une alternative est de ne passer qu'une seule variable de contexte de type Object qui contient une List avec l'ensemble des données.
Cependant, il faut tout de même placer les données dans la liste puis les extraire dans le job enfant.

Le parent est le même que dans le premier cas, seulement le code de la tâche tJavaRow devient:

// Les imports sont dans les Advanced Settings
import java.util.List;
import java.util.ArrayList;

// Put the params in an arrayList
List<String> params = new ArrayList<>();

params.add(input_row.id.toString());
params.add(input_row.name);
params.add(input_row.rating.toString());

// Set the data context to the params list
output_row.data = (Object)params;

et le schema devient:
parent32

Il n'y plus qu'un seul paramètre de passé au job enfant.
parent33

Concernant le Job enfant, celui-ci a toujours le tFixedFlowInput pour récupérer le context
firstchild30

et le passer à un tJavaRow qui est le miroir de celui du parent.
firstchild31

et evidemment, on obtient toujours le même résultat.
firstchild32