Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Talend Open Studio
  3. tMap et les fonctions Java dans Talend
Extrait - Talend Open Studio Le guide complet pour l'intégration de données
Extraits du livre
Talend Open Studio Le guide complet pour l'intégration de données
1 avis
Revenir à la page d'achat du livre

tMap et les fonctions Java dans Talend

Introduction

Le composant tMap est le composant le plus important et le plus complet dans Talend.

Grâce à ce composant, il est possible d’effectuer plusieurs transformations et jointures diverses entre différentes sources de données tout en récupérant leurs schémas, de récupérer les lignes en rejet, de créer des variables, de désigner des clés étrangères, de supprimer une ligne en sortie, d’effectuer des conditions avec plusieurs lignes en entrée, etc.

Le composant tMap permet également de faire appel à des fonctions Java afin d’effectuer des transformations diverses et variées, mais aussi de faire appel aux routines système et à celles que nous allons créer dans ce chapitre.

Dans ce chapitre, nous allons créer des routines personnalisées et nous verrons les notions Java les plus importantes pour pouvoir résoudre des problèmes d’implémentation que nous n’aurions pas pu résoudre avec les routines système de Talend.

Quelques notions sur Java dans Talend

Dans cette section du chapitre, nous allons voir quelques-unes des notions indispensables sur l’utilisation de Java dans Talend, avec pour chaque expression sa signification en français :

  • == : égal

  • != : différent

  • = : déclaration ou valorisation d’une variable en Java

  • Xxxx == 100 ou xxxx > 100 ou xxxx < 100 : teste la valeur d’un champ numérique

  • "toto".equals("xxx")/ !"toto".equals("xxx") : teste l’égalité/inégalité d’un champ de type String

  • Xxxx == null ou xxxx ! = null et Relational.isNull(Xxxx) / ! Relational.isNull(Xxxx) : teste la nullité ou non d’un champ

  • Xxxx.isEmpty()/ ! Xxxx.isEmpty() : teste si le champ est vide ou pas (vide <> null : un champ peut être non null mais vide)

  • Xxxx.startsWith ("xx") / Xxxx.endswith ("xx") : commence/termine par xxxx, LIKE en SQL ("xx%")/SQL ("%xx")

  • Xxxx.contains ("xx") : contient xxxx, LIKE en SQL ("%xx%")

  • Boolean : True / False (si la valeur est en string) ; 1/0 (si la valeur est en int)

Comment utiliser les routines système de Talend ?

Dans cette section, nous allons nous intéresser aux routines système de Talend les plus couramment utilisées. Les routines suivent l’ordre dans lequel elles sont affichées dans le dépôt. Elles sont regroupées en fonction de leur type. Chaque type est détaillé dans une section différente.

1. Routines numériques

Les routines numériques permettent de renvoyer des nombres entiers ou décimaux afin de les utiliser comme paramètres dans un ou plusieurs composants du job, par exemple pour ajouter des identifiants numériques.

Routine

Description

Syntaxe

sequence

renvoie un identifiant numérique incrémentiel

Numeric.sequence 
("Parameter name", 
start value, increment value) 

resetSequence

crée une séquence si elle n’existe pas et lui attribue une nouvelle valeur de départ

Numeric.resetSequence 
(Sequence Identifier, 
startvalue) 

removeSequence

supprime une séquence

Numeric.RemoveSequence 
(Sequence Identifier) 

random

renvoie un nombre entier aléatoire compris entre les valeurs maximale et minimale

Numeric.random(minimum 
start value, maximum end 
value) 

convertImplied DecimalFormat

renvoie une décimale à l’aide d’un modèle décimal implicite

Numeric.convertImplied
DecimalFormat ("Target 
Format", value to be  
converted) 

Les trois routines sequence, resetSequence et removeSequence sont étroitement liées :

  • La routine sequence est utilisée pour créer un identifiant de séquence, nommé s1 par défaut, dans le job. Cet identificateur de séquence est global dans le job.

  • La routine resetSequence peut être utilisée pour initialiser la valeur de l’identifiant de séquence créé par la routine sequence.

  • La routine removeSequence est utilisée pour supprimer l’identificateur de séquence de la liste des variables globales dans le job.

2. Routines relationnelles

Les routines relationnelles permettent de vérifier les affirmations basées sur des booléens.

Routine

Description

Syntaxe

ISNULL

Elle vérifie si la variable fournie est une valeur nulle. Elle renvoie true si la valeur est NULL et false si la valeur...

Les conversions dans Talend

Dans cette section du chapitre, nous allons voir comment s’effectuent les conversions de types de données, ce qui est très récurrent dans le développement de jobs Talend.

  • Integer.valueOf("xxxx") : conversion d’un string en int.

  • String.valueOf(xxxx) : conversion d’un int en string.

  • variable.toString() ou xxxx + "" : conversion d’un int ou float en string.

  • Float.parseFloat("xxxx") : conversion d’un char en float.

  • BigDecimal("xxxx" ou xxxx) : conversion en BigDecimal (de string ou integer).

  • TalendDate.parseDate("dd/MM/yyyy","01/01/2020") : conversion d’un string en date en précisant le format du string.

  • TalendDate.formatDate("dd", XXX) : affichage du jour uniquement. Il faut que XXX soit au format Date (via parseDate si besoin). La sortie est au format string.

  • StringHandling.LEFT(xxxx,y) / StringHandling.RIGHT(xxxx,y) : récupération des Y caractères de la chaîne en partant de la gauche ou de la droite. Cette fonction propre à Talend protège des null.

  • xxxx.substring(0,3) : du premier au troisième caractère d’une chaîne.

  • Arrays.asList("X","Y").contains(xxxx) : champ xxxx dans la liste. Nécessite un import java.util.Arrays; dans Advanced settings d’un...

Talend et les tests ternaires

Dans cette section du chapitre, nous allons voir les trois tests ternaires les plus utilisés lors du développement de jobs Talend.

  • Xxxx != null ? Xxxx : null : (Test) ? Valeur si vrai : Valeur si faux.

  • Xxxx != 0 ? Xxxx : 0 : en Java, si l’objet est en int, le null n’est pas accepté, il faut mettre un 0.

  • "Toto".equals(xxxx) ? Xxxx : "" : si XXXX = "Toto", alors afficher XXXX, sinon vide.

Job 23 : mon premier job avec les jointures

Après avoir importé les schémas des tables de la base de données « HR  », voici quelques manipulations afin de bien comprendre les jointures avec Talend.

1. Étape 1

Dans la base de données HR, la table EMPLOYEES contient employee_id et manager_id, qui est lui-même un employee_id. La table EMPLOYEES sera donc importée deux fois : une fois pour les employés et une fois pour les managers. 

images/03EP01.png

Schéma HR de la base de données

2. Étape 2

Un tMap, qui est un composant de mapping global, puis un tLogRow, sont placés pour afficher la sortie. La jointure tMap est ensuite reliée à la sortie tLogRow et les deux composants Employee et tMap sont liés. Notez que le premier lien est de type Main et le deuxième de type Lookup. Une connexion peut avoir un seul lien Main et plusieurs liens Lookup.

images/03EP02.png

Connexion des composants avec tMap et tLogRow

3. Étape 3 (éditer le tMap)

 Effectuez un double clic sur tMap.

 Effectuez un glisser/déposer (par exemple, liez MANAGER_ID à EMPLOYEE_ID). 

images/03EP03.png

Mettre en lien les clés MANAGER_ID et EMPLOYEE_ID

images/03EP04.png

Résultats du traitement

Comme indiqué ci-dessus, l’identifiant, le nom et le prénom de l’employé s’affichent, ainsi que le nom et le prénom...

Job 24 : trier les données avec tMap

Le job Talend TMAP_SORT_DATA permet de trier les données d’un fichier représentant les pays à l’aide du composant tMap en utilisant des fonctions Java contenues dans Talend pour spécifier le pays.

images/03EP09.png

Aperçu du job

Étapes à suivre

 Créez un composant tInputFileDelimited.

 Créez un composant tMap et trois tlogROW pour stocker les données triées dans trois bases de données différentes.

 Générez les contextes ou importez le fichier d’entrée en dur.

 Paramétrez le composant tMap en créant trois bases de données à droite de la fenêtre qui s’ouvre (en double cliquant sur tMap).

 Glissez et déposez de tous les champs qui existent dans l’entrée.

 Cliquez sur le plus à droite de chaque nouvelle base de données pour émettre une condition, par exemple :

[(‘'USA'').equals(row1.pays)] 

 Synchronisez les colonnes sur tous les tLogRow et cochez la case Tableau.

images/03EP10.png

Configuration du composant tMap

La fonction Java equals demande au composant tMap de ne retourner que les lignes qui contiennent les valeurs USA pour tLogRow_1, FRANCE pour tLogRow_2 et GERMANY pour tLogRow_3.

images/03EP11.png

Résultat du composant tLogRow_1

images/03EP12.png

Résultat du composant tLogRow_2

images/03EP13.png

Résultat du composant...

Job 25 : les fonctions Java dans tMap

Le job JAVA_FUNCTIONs permet d’utiliser plusieurs fonctions Java contenues dans Talend afin de réaliser diverses opérations en vue de transformer les données en sortie.

images/03EP14.png

Job et paramètres du composant tFileInputDelimited

images/03EP15.png

Paramétrage du composant tMap

images/03EP16.png

Les fonctions Java

row1.FIRSTname+"-"+row1.LASTname 
  • Sert à concaténer le nom et le prénom et les afficher ensemble séparés par un tiret.

StringHandling.UPCASE(row1.COUNTRY) 
  • Sert à mettre tous les noms des pays en majuscules.

("France").equals(row1.COUNTRY)? "NOT ENTITLED:"ENTITLED" 
  • Signifie que si le pays est « FRANCE  », le résultat doit être NOT ENTITLED, sinon il doit être ENTITLED.

(row1.SALARY <900)? row1.SALARY*120/100 : row1.SALARY*1 
  • Sert à émettre une augmentation de 20 % pour les salariés ayant un salaire de moins de 900 euros et de 0 % sinon.

StringHandling.LEFT(row1.DATE,6) 
  • Sert à récupérer seulement le jour et le mois dans une date.

images/03EP17.png

Paramétrage du composant tFileInputDelimited

images/03EP18.png

Contextes du composant tFileInputDelimited

images/03EP19.png

Schéma du fichier dans tFileInputDelimited

Job 26 : jointure Left Outer Join (jointure à gauche) et Right Outer Join (jointure à droite)

Dans ce job Talend OUTER_LEFT_RIGHT_JOIN, nous allons voir, tout d’abord, comment effectuer une jointure à gauche avec le composant tMap.

La jointure à gauche signifie que toutes les lignes qui existent dans le fichier avec le lien Main (dans ce job, il s’agit de EMPLOYES) et qui existent aussi dans le fichier avec le lien Lookup (dans ce job, il s’agit de ORDERS) vont être récupérées. La jointure devra s’effectuer en se basant sur une clé, celle-ci correspondant à une colonne commune aux deux fichiers EMPLOYES et ORDERS et qui n’est pas nulle (elle doit contenir une valeur).

images/03EP20.png

Job OUTER_LEFT_RIGHT_JOIN

images/03EP21.png

Paramétrage du composant tFileInputDelimited_1

images/03EP22.png

Paramétrage du composant tFileInputDelimited_2

images/03EP23.png

Jointure Left Outer Join

La clé permettant d’effectuer une jointure Left outer Join pour ce job est la colonne IDEmployee car elle correspond à la clé du fichier des EMPLOYES et qu’elle existe également dans le fichier des ORDERS. Notez la présence d’une clé de couleur jaune à côté du nom la colonne. Cette colonne étant également présente dans le fichier des ORDERS, on dit que IDEmployee est une clé étrangère dans ORDERS, elle est donc représentée...

Job 27 : jointure Inner Join (premier job)

Le job Talend tMap permet d’effectuer une jointure Inner Join avec le composant tMap sur Talend. Inner Join est une jointure qui permet d’extraire les données communes à deux ou plusieurs sources de données (fichiers, tables, etc.) à l’aide d’une clé commune. Dans ce job, nous allons apprendre comment effectuer une jointure Inner Join entre trois fichiers : Products, Suppliers et Categories. L’objectif est d’extraire, dans trois fichiers distincts, les produits par catégories provenant des fournisseurs des pays suivants : Royaume-Uni (UK), États-Unis (USA) et Allemagne. Ensuite, nous allons créer un autre fichier contenant, par catégorie, tous les produits provenant de fournisseurs qui ne sont pas issus de l’un de ces pays spécifiés.

images/03EP29.png

Paramétrage de la jointure Inner Join entre trois tables et génération de trois fichiers CSV correspondant à chaque résultat selon le cas (UK, USA, Allemagne - partie1)

Dans la figure ci-dessus, toutes les données à retourner dans les résultats de la jointure ont été sélectionnées par glisser-déposer dans des bases de données différentes. La première d’entre elles est la base de données UK, dans laquelle a été spécifiée...

Job 28 : jointure Inner Join (deuxième job)

Le job Talend InnerJoin permet d’effectuer une jointure Inner Join avec le composant tMap entre deux fichiers qui contiennent une liste de clients d’une part et les commandes effectuées par ces clients d’autre part. Le but est d’extraire les commandes effectuées par des clients aux États-Unis, au Royaume-Uni, en Espagne et dans les autres pays, puis de mettre toutes ces données dans des fichiers différents.

images/03EP32.png

Job InnerJoin

images/03EP33.png

Paramétrages du composant tMap

Il est à noter que pour chaque sortie, il a été spécifié que row1.Country doit être égal à, respectivement, USA pour le fichier de sortie qui contient les commandes des clients des USA,

("USA").equals(row1.Country) 

UK pour le fichier de sortie qui contient les commandes des clients du Royaume -Uni,

("UK").equals(row1.Country) 

Spain pour le fichier de sortie qui contient les commandes des clients d’Espagne. 

("Spain").equals(row1.Country) 

La clé commune entre les deux fichiers en entrée est CustomerName.

Le modèle de jointure (Join Model) a également été spécifié, de même que le modèle de correspondance (Match Model).

images/03EP34.png

Résultats du job InnerJoin

Job 29 : jointure Inner Join avec tJoin

Dans ce job Talend JobtJoin il s’agit d’effectuer une jointure entre deux fichiers, Orders et Clients. La jointure en question est de type Inner Join, et va permettre de retourner en sortie, dans des fichiers distincts, les personnes qui ont effectué des commandes et les personnes qui n’en ont pas effectué.

images/03EP35.png

Job_tJoin

images/03EP36.png

Paramétrage du composant tJoin

Tout d’abord, les colonnes à retourner en sortie ont été spécifiées dans Mapping de la colonne, tout en spécifiant au composant d’inclure la colonne Lookup dans la sortie. En effet, sans cela, aucune colonne du Lookup (dans ce job il s’agit de celles du fichier Orders) ne pourrait être retournée en sortie. Puis, la clé sur laquelle la jointure Inner Join doit être effectuée a été définie..

Il est à noter que la clé définie est la colonne CustomerID, qui figure dans les deux fichiers, et que la case Jointure Inner Join (avec rejets en sortie) a été cochée afin de retourner les colonnes qui ne satisfont pas la condition de la clé, à savoir CustomerID=row2.CustomerID.

images/03EP37.png

Résultats du job

Job 30 : jointure Full Outer Join

Dans ce job Talend FULL_JOIN, il s’agit d’effectuer une jointure entre deux fichiers. La jointure en question se nomme Full Outer Join et permet de retourner en sortie, dans un fichier commun, les numéros et dates de commandes des clients ainsi que leurs noms et prénoms.

images/03EP38.png

Job FULL_JOIN

Pour effectuer une jointure Full Outer Join, il est nécessaire d’effectuer d’abord une jointure à gauche en mettant le fichier des clients avec le lien Main vers le tMap_1 et Orders en lien Lookup, puis d’effectuer une autre jointure mais cette fois avec le fichier des clients en lien Lookup et Orders en lien Main vers le tMap_2.

La jointure effectuée dans le tMap_2 peut être considérée comme une jointure à droite entre le fichier clients et le fichier Orders car c’est une jointure contraire à celle du tMap_1.

images/03EP39.png

Jointure à gauche Clients et Orders

images/03EP40.png

Jointure à droite Clients et Orders

Pour joindre les données en sortie des deux tMap, le composant tUnite, spécifiquement conçu pour cela, est utilisé.

images/03EP41.png

Résultat du Job FULL_JOIN

Job 31 : job avec routines

images/03EP42.png

Paramétrage de routine dans tMap

Le nom de la routine créée est gestion_stock. Elle est ensuite appelée dans tMap afin de générer un rapport ou un fichier contenant toutes les lignes satisfaisant la condition précédemment écrite dans la routine. Voici le code de la routine gestion_stock :

images/03EP43.png

Code de la routine

Explication du code

 Renvoyez ALERTE_SURSTOCK si UNITES_STOCK est supérieur à 100.

 Renvoyez STOCK_NORMAL si UNITES_STOCK est inférieur à 100 et supérieur à 10.

 Renvoyez ALERTE_STOCK_inférieur si UNITES_STOCK est inférieur ou égal à 10.

images/03EP44.png

Résultat du JOB_ROUTINES

Les messages d’erreurs fréquents dans Talend

Lorsqu’un message d’erreur s’affiche dans Talend, il est parfois compliqué de savoir de quoi relève le problème. Voici quelques-unes des erreurs les plus fréquentes lors du développement de jobs Talend et leurs significations.

  • Data Truncation : la longueur des données d’un champ dépasse sa taille. En général, Talend indique le champ concerné, mais pas la ligne.

  • java.lang.NullPointerException : cela se produit généralement lors de l’utilisation d’un test ternaire dans un composant tMap, lorsque le cas de nullité de l’objet en entrée n’a pas été traité.

  • java.lang.NumberFormatException:null : cette erreur se produit dans les cas suivants :

  • Si conversion en nombre d’une chaîne de caractères qui ne représentent pas un nombre.

  • Si l’objet est null : remplacer le null par une valeur par défaut (0).

  • Si la valeur est divisée par 0.

  • For input string : cette erreur se produit dans les cas suivants :

  • Si le format ne correspond pas (int dans string par exemple).

  • L’erreur "For input string" se produit lorsque l’en-tête du fichier intégré est interprété comme une ligne, ce qui peut être dû au nombre de lignes de l’en-tête....

Exemples de code Java à utiliser quotidiennement

Dans cette section vont être évoqués quelques-uns des codes Java les plus utiles et les plus utilisés quotidiennement en production. Ces lignes de code peuvent être implémentées à l’aide de routines ou avec des composants du type tJava.

1. Compter le nombre de lignes d’un fichier CSV

package routines; 
import java.io.BufferedReader; 
import java.io.FileReader; 
 
public class Main { 
  public static void main(String[] args) throws Exception { 
    // Ouvre un BufferedReader pour lire le fichier CSV 
    BufferedReader reader = new BufferedReader(new FileReader("fichier.csv")); 
 
    // Compte le nombre de lignes 
    int lineCount = 0; 
    while (reader.readLine() != null) { 
      lineCount++; 
    } 
 
    // Ferme le BufferedReader 
    reader.close(); 
 
    // Affiche le nombre de lignes 
    System.out.println(lineCount); 
  } 
} 

Ce code utilise la classe BufferedReader de la bibliothèque de base de Java pour lire le fichier CSV ligne par ligne. Il utilise une boucle while pour compter le nombre de lignes lues jusqu’à ce que la fin du fichier soit atteinte (indiquée par la méthode readLine() qui renvoie null). Enfin, il ferme le BufferedReader et affiche le nombre de lignes lues.

Cette solution est plus simple que l’utilisation de regex, mais elle nécessite d’avoir accès aux lignes du fichier dans leur intégralité et peut être moins efficace pour de très gros fichiers.

En utilisant une regex

package routines; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
 
public class Main { 
  public static void main(String[] args) throws Exception { 
    // Lit le contenu du fichier CSV dans une chaîne de caractères 
    String csvContent = 
new String(Files.readAllBytes(Paths.get("fichier.csv"))); ...