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
#!/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 perspectivesCe 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)
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=INFOLes 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 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
// 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é)
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
#!/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 stderrPour 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.