Skip to content
Learni
Voir tous les tutoriels
Data Engineering

Comment créer un job ETL avec Talend en 2026

Read in English

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.