Skip to content
Learni
View all tutorials
Data Engineering

Comment créer un job ETL avec Talend en 2026

Introduction

Talend Open Studio reste en 2026 l'outil ETL open-source de référence pour les data engineers, avec son interface drag-and-drop qui accélère le développement tout en générant du code Java natif et scalable. Pourquoi l'utiliser ? Il gère des volumes massifs de données (Big Data via Spark), intègre l'IA pour l'auto-documentation des jobs, et s'intègre seamlessly avec cloud (AWS, Azure) et bases NoSQL. Dans un monde où 80% du temps des data teams est perdu en plomberie de données, Talend réduit ce temps de 70% selon Gartner 2025.

Ce tutoriel intermédiaire vous guide pour créer un job ETL complet : lire un CSV clients, transformer (nettoyage, agrégation), charger en MySQL. Vous apprendrez l'installation, la config contexte, les composants clés (tFileInputDelimited, tMap, tMySQLOutput), la génération de code, et l'exécution CLI. À la fin, vous aurez un job production-ready, bookmarquez-le pour vos projets réels. Prêt à booster vos pipelines ? (128 mots)

Prérequis

  • Java 8 ou 11 installé (OpenJDK recommandé, vérifiez avec java -version).
  • MySQL 8+ avec un serveur local (root/password: root).
  • Espace disque 2GB pour Talend Open Studio 8.0+.
  • Connaissances de base en SQL, Java et CSV.
  • Téléchargez Talend Open Studio pour Data Integration depuis talend.com (gratuit).

Télécharger et installer Talend

install-talend.sh
#!/bin/bash

# Téléchargement de Talend Open Studio 8.0 (adaptez l'URL à la dernière version 2026)
URL="https://github.com/Talend/open-studio-dist/releases/download/8.0.2/TOS_DI-20230220_1200-V8.0.2.zip"
wget $URL

# Décompression
unzip TOS_DI-*.zip -d /opt/talend/

# Lancement (Linux/Mac, adaptez pour Windows: double-clic)
cd /opt/talend/TOS_DI-*/
./Talend-Studio

# Vérification: Studio s'ouvre avec Repository, Integration perspectives

Ce script automatise le téléchargement et le lancement de Talend. Il place l'archive dans /opt pour une install système. Attention : sur Windows, utilisez PowerShell ou 7-Zip ; vérifiez les checksums pour sécurité en prod. Évitez sudo pour les perms.

Créer un nouveau projet et job

Démarrez Talend Studio : acceptez la licence, créez un nouveau projet 'MonProjetETL' via File > New > Project. Dans Repository (vue gauche), right-click Jobs > Create job nommé 'CSV_to_MySQL'.

L'interface s'ouvre : palette composants à droite (Search: tFileInputDelimited), zone design au centre, schema editor en bas. Analogie : comme un Lego pour dataflows, chaque bloc = composant réutilisable. Glissez tFileInputDelimited sur la canvas pour lire CSV. Configurez : File name = "/path/to/clients.csv" (créez un CSV sample : id,nom,email | 1,Durand,durand@test.com).

Configurer le contexte (variables globales)

context.properties
db_host=localhost
db_port=3306
db_name=etl_db
db_user=root
db_pass=root
csv_input_path=/tmp/clients.csv
csv_output_path=/tmp/clients_clean.csv
batch_size=1000
log_level=INFO

Les contextes externalisent les configs (dev/prod) sans recompiler. Dans Talend, Repository > Contexts > Create context group, ajoutez ces vars (type String/Int). Liez-les au job via Ctrl+Space. Piège : oubliez les quotes pour paths avec espaces.

Définir le schéma d'entrée et ajouter tMap

Schéma input (double-click tFileInput) : Edit schema > +3 cols : id (Integer), nom (String 50), email (String 100). Guess schema si CSV header.

Connectez à tMap (drag depuis palette). tMap = cœur transformation : input table gauche, output droite. Drag cols vers output, ajoutez expressions : ex. email_clean = email:toUppercase(). Filtre row : !email.contains("spam"). Output : 3 cols + total_records (Integer, globalMap). Analogie : Excel formulas en scale industrielle.

Script SQL pour préparer la base MySQL

create_table.sql
CREATE DATABASE IF NOT EXISTS etl_db;
USE etl_db;

CREATE TABLE IF NOT EXISTS clients_clean (
  id INT PRIMARY KEY,
  nom VARCHAR(50) NOT NULL,
  email VARCHAR(100) UNIQUE,
  processed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Insert sample pour test
INSERT INTO clients_clean (id, nom, email) VALUES (1, 'Dupont', 'dupont@test.com');

Exécutez ce SQL dans MySQL Workbench/CLI avant le job. Il crée DB/table avec contraintes. En prod, ajoutez indexes sur email. Piège : mismatch types entre Talend schema et DB cause RuntimeException.

Ajouter sortie DB et Run le job

Connectez tMap output à tMySQLOutput (config : DB connection > Repository > Create MySQL > host/context.db_host, etc. ; Action: Insert; Schema sync avec tMap output).

Run : toolbar play ▶️. Logs en bas : stats rows processed. Erreur ? Vérifiez props. Export job : right-click > Export Java Project (pour CLI).

Exemple d'expression Java dans tMap

tmap_expression.java
// Expression pour nettoyer email (copiez dans tMap cell)
((String)row1.email != null ? row1.email.toLowerCase().replaceAll("\\s+", "") : "") + "@validated.com"

// Filtre ligne (condition If)
!row1.email.contains("@fake.com") && row1.nom.length() > 2

// Variable globale pour compteur
((Integer)globalMap.get("total_records") == null ? 1 : ((Integer)globalMap.get("total_records") + 1))

Ces snippets Java vont dans tMap cells/filters. Talend parse Talend Java User Guide syntaxe. Pourquoi ? Puissance : regex, TalendDate, routines custom. Piège : null checks obligatoires, sinon NPE crash job.

Code Java généré du job complet (simplifié)

CSV_to_MySQL_0_1.java
import routines.Numeric;
import routines.DataOperations;
import routines.TalendDataGenerator;
import routines.TalendString;
import routines.java;
import routines.system.*;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.*;

public class CSV_to_MySQL_0_1 {

  protected static void logIgnoredError(String message, Throwable cause) {
    System.err.println(message);
    if (cause != null) { cause.printStackTrace(); }
  }

  public static class row1Struct {
    public int id;
    public String nom;
    public String email;
  }

  public static class out1Struct {
    public int id;
    public String nom;
    public String email_clean;
  }

  private static class Context {
    public String db_host = "localhost";
    // ... autres contexts
  }

  public static void main(String[] args) {
    Context ctx = new Context();
    java.util.Map<String, Object> globalMap = java.util.Collections.synchronizedMap(new java.util.HashMap<String, Object>());
    globalMap.put("ctx", ctx);

    try {
      // Simule tFileInputDelimited
      File csvFile = new File("/tmp/clients.csv");
      BufferedReader br = new BufferedReader(new FileReader(csvFile));
      String line;
      int rowCount = 0;
      while ((line = br.readLine()) != null) {
        if (rowCount++ == 0) continue; // skip header
        String[] fields = line.split(",");
        row1Struct row1 = new row1Struct();
        row1.id = Integer.parseInt(fields[0]);
        row1.nom = fields[1];
        row1.email = fields[2];

        // tMap transformation
        out1Struct out1 = new out1Struct();
        out1.id = row1.id;
        out1.nom = row1.nom.toUpperCase();
        out1.email_clean = (row1.email != null ? row1.email.toLowerCase() : "");

        if (!out1.email_clean.contains("fake")) {
          // tMySQLOutput simule
          Class.forName("com.mysql.cj.jdbc.Driver");
          Connection conn = DriverManager.getConnection("jdbc:mysql://" + ctx.db_host + "/etl_db", "root", "root");
          PreparedStatement pstmt = conn.prepareStatement("INSERT INTO clients_clean (id, nom, email) VALUES (?, ?, ?)");
          pstmt.setInt(1, out1.id);
          pstmt.setString(2, out1.nom);
          pstmt.setString(3, out1.email_clean);
          pstmt.executeUpdate();
          pstmt.close();
          conn.close();
          globalMap.put("total_records", rowCount);
          System.out.println("Inserted: " + out1.id);
        }
      }
      br.close();
      System.out.println("Job complet: " + globalMap.get("total_records") + " rows.");
    } catch (Exception e) {
      logIgnoredError("Main job error", e);
    }
  }
}

Ce code Java est l'export simplifié d'un job Talend (générez-le via Export > Standalone). Il lit CSV, applique tMap (upper/lower), insère MySQL si filtre OK. Ajoutez MySQL JAR en lib. Compilez : javac -cp mysql-connector.jar CSV_to_MySQL_0_1.java. Piège : gérez encodings UTF-8 pour accents.

Exécuter le job en ligne de commande

run-job.sh
#!/bin/bash

# Après export Talend (zip job), unzip et cd
cd CSV_to_MySQL_0_1/

# Compile (ajoutez jars Talend + MySQL)
javac -cp "lib/*:mysql-connector-j-8.0.33.jar" *.java

# Run avec contexts
java -cp "lib/*:mysql-connector-j-8.0.33.jar:.:$CLASSPATH" CSV_to_MySQL_0_1 "-Dfile.encoding=UTF-8" "-Dcontext=db_host=localhost"

# Logs: rows processed, errors en stderr

Pour prod, exportez Standalone et runnez headless. Ajoutez jars Talend routines/DB drivers. Utilisez -Dprops pour override context. Piège : paths absolus pour CSV/DB, testez avec nohup pour background.

Bonnes pratiques

  • Modularisez : routines Java réutilisables (Repository > Routines) pour log custom/validation.
  • Gestion erreurs : tWarn/tDie + OnComponentError pour flux reject.
  • Performances : activez parallelize (tParal...), batchSize=10000 en DB output.
  • Versioning : Git integration native, branch par env.
  • Sécurité : chiffrez context pass (Talend Crypt), evitez hardcode creds.

Erreurs courantes à éviter

  • Schema mismatch : sync toujours input/output schemas, relancez Guess.
  • NullPointer en tMap : utilisez TalendNullHandling routines.
  • Mémoire OOM : -Xmx4g JVM args, limitez rows en test.
  • CORS/DB connect : testez JDBC URL manuellement avant job.

Pour aller plus loin

  • Doc officielle : Talend Help Center.
  • Avancé : Talend Cloud, Spark jobs, Stitch pour CDC.
  • Certifications : Talend Data Integration certif.
  • Découvrez nos formations Learni Dev sur ETL avancés et Data Mesh.