Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > ETL > Talend
Talend Forum d'entraide sur Talend (Talend Open Studio, ...). Avant de poster --> FAQ Talend, Tutoriels Talend
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/07/2007, 11h42   #1
Invité régulier
 
Inscription : juin 2007
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 21
Points : 5
Points : 5
Par défaut Talend et les variables globales

Bonjour,

Voila, je débute avec Talend Open Studio et je voudrais svoir s'il y a moyen de rajouter des variables globales personnalisées (concernant la totalité d'un projet ou à l'intérieur d'un seul job) à la liste de variables globales Système (que l'on peut afficher en appyuant sur Ctrl+Space). Et ça dans le but de les utiliser dans différents composants du job.

Merci d'avance.
sounine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 12h14   #2
Membre éclairé
 
Avatar de bouvda
 
Inscription : octobre 2005
Messages : 252
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2005
Messages : 252
Points : 312
Points : 312
Envoyer un message via MSN à bouvda
Bonjour,

je ne pense pas qu'il soit possible de faire des variables globales à tout un projet.
Par contre, au niveau du job les variables sont stockées dans la variable globalMap. Mais il n'y aura pas d'accès avec Ctrl + Space.
Il vaut mieux utiliser des paramètres dans le contexte du job qui sont, au final, des variables globales au job et qui seront accessibles avec l'auto-complétion.
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 15h26   #3
Invité régulier
 
Inscription : juin 2007
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 21
Points : 5
Points : 5
Bonjour,

Merci pour la réponse, mais si vous pourriez être un peu plus clair par rapport à l'auto-complétion.
Quand on déclare un paramètre contexte, comment peut-on accéder à ce paramètre comme étant une variable globale?

Merci encore une fois.
sounine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 15h35   #4
Membre éclairé
 
Avatar de bouvda
 
Inscription : octobre 2005
Messages : 252
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2005
Messages : 252
Points : 312
Points : 312
Envoyer un message via MSN à bouvda
Et bien en Java, si il y a un paramètre toto, il suffit de presser Ctrl+Space et dans la liste qui s'ouvre alors il y aura context.toto .

En choisissant context.toto, alors Talend va écrire (si toto est de type Double):
Code :
Double.parseDouble(((String)context.getProperty("toto")))
Cela permet de lire la valeur de toto.
Pour affecter une valeur à toto il faudrait faire :
Code :
1
2
 
context.setProperty("toto",new Double(2.3).toString())
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 16h31   #5
Invité régulier
 
Inscription : juin 2007
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 21
Points : 5
Points : 5
Bonjour,

Voila je vais vous expliquer en détails mon problème : j'effectue en ce moment une mise à jour d'une table qui contient 5 Millions de lignes. Lors de la mise à jour, je ne supprime pas les lignes qui ont été modifiées, en fait j'ai rajouté un champ (Flag) qui indique si la ligne est valide ou pas ('O' pour dire Valide et 'N' pour dire Non Valide). Ce que je fait est donc une sorte d'historisation afin de garder un historique des modifications de chaque ligne.
J'ai aussi deux champs : "Date_Debut" et "Date-Fin" qui indique la période sur laquelle la ligne est valide.

Mon job s'effectue sur deux étapes :

Première étape : je cherche les lignes qui ont été modifiées et j'effectue une mise à jour simple de ma table en insérant 'N' au champ Flag correspondant à la ligne modifiée et j'insère aussi la date courante du système(1) dans le champ "Date_Fin".

Deuxième étape : j'insère les nouvelles lignes avec 'O' comme Flag et la date courante du système (2) dans le champ 'Date_Debut".

le problème est le suivant : comme j'utilise une table qui contient 5 Millions de lignes, j'obtient un décalage entre la 'date courante du système (1)' et la 'date courante du système (2)'

j'ai pensé donc à déclarer une variable globale de type Date, de l'affecter au début du job avec la date courante du système (1) et de faire appel à cette variable dans la deuxième étape du job.

Dites moi ce que vous pensez de cette solution, est-elle réalisable à votre avis? auriez-vous sinon une autre solution au problème?

Merci Beaucoup pour l'effort.
sounine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 16h38   #6
Membre éclairé
 
Avatar de bouvda
 
Inscription : octobre 2005
Messages : 252
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2005
Messages : 252
Points : 312
Points : 312
Envoyer un message via MSN à bouvda
Cette solution est réalisable : c'est celle que je l'utilise également.
Au tout début de mon job, je stocke la date courante dans mon paramètre afin d'avoir le même date tout le long du projet et éviter des décalages de 15 minutes voire plus.
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 17h15   #7
Invité régulier
 
Inscription : juin 2007
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 21
Points : 5
Points : 5
j'ai déclaré un paramètre 'date2' de type Date, talend écris alors :

(java.util.Date)((String)context.getProperty("date2"))

dans le même job, j'essaye d'utiliser ma variable 'date2' dans un composant tMap en l'affectant à un champ date. Talend alors n'accepte pas cette affectation dans le composant tMap et me génère ce messag ed'erreur :

'Error on (java.util.Date)((String)context.getProperty("date2")) => Cannot cast from String to Date'

J e voudrais donc juste savoir comment vous avez fait pour déclarer votre paramètre Date et pour l'utiliser plus tard? et dans quelle composant faut-il écrire la commande qui sert à insérer une valeur dans la paramètre?

Merci beaucoup
sounine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2007, 08h07   #8
Membre éclairé
 
Avatar de bouvda
 
Inscription : octobre 2005
Messages : 252
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2005
Messages : 252
Points : 312
Points : 312
Envoyer un message via MSN à bouvda
Bonjour,

pour lire le paramètre date, il faut créer une instance de Date :
Le plus rapide est de faire :
Code :
1
2
 
new Date((String)context.getProperty("date2")))
Mais ce n'est pas très propre car ce constructeur de Date est déprécié, il vaut mieux faire :
Code :
1
2
 
new SimpleDateFormat("YYYY-MM-DD").parse((String)context.getProperty("date2")))
"YYYY-MM-DD" étant à remplacer par le format de date que vous utilisez pour votre paramètre.


Pour affecter une valeur au paramètre, j'utilise le composant tJava.
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2007, 10h32   #9
Membre éclairé
 
Avatar de bouvda
 
Inscription : octobre 2005
Messages : 252
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2005
Messages : 252
Points : 312
Points : 312
Envoyer un message via MSN à bouvda
Citation:
Envoyé par bouvda
Bonjour,

je ne pense pas qu'il soit possible de faire des variables globales à tout un projet.
Je me suis trompé, je viens d'avoir une idée.
Il suffit de créer une routine qui contient des variables publiques statiques. Ainsi ces variables sont accessibles dans tous les jobs du projet.
En plus, cela permet d'avoir des variables de tout type possible en Java, notamment des tableaux etc...

[EDIT]
Je viens de tester et ça ne fonctionne pas .
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2007, 11h06   #10
Invité régulier
 
Inscription : juin 2007
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 21
Points : 5
Points : 5
Bonjour,

j'ai essayé votre solution en mettant une date fixe comme valeur par défaut du paramètre et ça marche.
le problème est que quand j'essaye de mettre la date courante du système (TalendDate.getCurrentDate()) comme valeur par défault du paramètre, Talend me renvoie un message d'erreur lors de l'exécution :

Exception in component tMap_1
java.text.ParseException: Unparseable date: "TalendDate.getCurrentDate()"


Je n'arrive pas à affecter le date courante à mon paramètre. c'est la solution à votre avis?

Merci beaucoup pour votre aide précieuse.
sounine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2007, 11h18   #11
Membre éclairé
 
Avatar de bouvda
 
Inscription : octobre 2005
Messages : 252
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2005
Messages : 252
Points : 312
Points : 312
Envoyer un message via MSN à bouvda
Si vous avez mis TalendDate.getCurrentDate() dans la case Default dans l'onglet Contexts où vous déclarez votre paramètre, il est normal d'obtenir une erreur car on ne peut mettre qu'une valeur fixe à cet endroit.

Pour affecter une valeur à l'exécution, il faut faire dans un composant tJava :
Code :
context.setProperty("date2",TalendDate.getDate("YYYYMMDD"));
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2007, 12h20   #12
Invité régulier
 
Inscription : juin 2007
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 21
Points : 5
Points : 5
Merci infinément pour toutes ces informations précieuses.
le problème de décalage est résolu.

Je vais réfléchir sur la possibilité d'avoir une variable globale pour tout le projet. Tenez moi au courant si vous trouvez une solution.

Merci encore une fois.:merci
sounine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 11h12   #13
Nouveau Membre du Club
 
Inscription : juin 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 109
Points : 37
Points : 37
Bonjour,

J'essaye aussi d'insérer dans une table Oracle "Journal" la date et l'heure de début et fin de chaque job.

J'ai relié un "tjava" à mon t_map avec dedans :
context.setProperty("date_debut",TalendDate.getDate("YYYYMMDD"));


Puis dans un tOracleRow j'ai mis l'update :

update journal
set date_debut= " + new SimpleDateFormat("YYYYMMDD").parse((String)context.getProperty("date_debut")) +"
where FONCTION ='CHARGEMENT' and TRAITEMENT='CATALOGUE_INTERVENTION'"


il me fait une erreur:
java.lang.IllegalArgumentException: Illegal pattern character 'Y'.


Il n'a pas l'air d'aimer les dates....

Vous sauriez d'où ça vient?
lolotte35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 11h41   #14
Membre éclairé
 
Avatar de bouvda
 
Inscription : octobre 2005
Messages : 252
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2005
Messages : 252
Points : 312
Points : 312
Envoyer un message via MSN à bouvda
Bonjour,

il faut utiliser 'y' et non 'Y' avec un objet SimpleDateFormat.
Votre reqûete deviendrait :
Code :
1
2
3
4
 
"update journal
set date_debut= '" + new SimpleDateFormat("yyyyMMdd").parse((String)context.getProperty("date_debut")) +"'
where FONCTION ='CHARGEMENT' and TRAITEMENT='CATALOGUE_INTERVENTION'"
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 12h10   #15
Nouveau Membre du Club
 
Inscription : juin 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 109
Points : 37
Points : 37
Je n'ai plus la même erreur:
Exception in component tOracleRow_1
java.lang.RuntimeException: Execution failure, there might be an error in your SQL syntax.

Je me dit que ce format de date:
SimpleDateFormat("yyyyMMdd")
n'est peut être pas compatible avec mes dates Oracle.

Sous oracle ce sont juste des formats date toute simple, aujourd'hui ce qu'il y a dedans est:
17/07/2007 11:37:06

Quand je vais directement dans mon toad :

update journal
set date_debut= '17072007'
where FONCTION ='CHARGEMENT' and TRAITEMENT='CATALOGUE_INTERVENTION'

cela fonctionne bien, il me met ensuite 17/07/2007 dans ma variable date_debut
lolotte35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 12h17   #16
Nouveau Membre du Club
 
Inscription : juin 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 109
Points : 37
Points : 37
J'ai relié mon tmap avec mon tjava par un lien "main" order3, est ce que ce ne serai pas encore ça le problème?

car le tOracleRow est relié au tOracleOutput qui est relié par un "main order 1" au tmap.

Je ne sais pas dans quel ordre il execute les composants.
lolotte35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 12h37   #17
Membre éclairé
 
Avatar de bouvda
 
Inscription : octobre 2005
Messages : 252
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2005
Messages : 252
Points : 312
Points : 312
Envoyer un message via MSN à bouvda
Je ne suis pas certain que le problème vienne de cela.
Mais une manière plus propre de procéder est d'enlever le lien entre le tMap et le tJava puis de créer un lien Run if Ok depuis le tJava jusqu'au PostgreSqlInput.
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 14h04   #18
Nouveau Membre du Club
 
Inscription : juin 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 109
Points : 37
Points : 37
Alors j'ai créé le lien "run if ok" depuis le tjava vers le tPostgreSqlInput.

Je viens d'afficher :
new SimpleDateFormat("YYYYMMDD").parse((String)context.getProperty("date_debut"))
dans une fenêtre tSystem et cela donne : "Tue Jul 17 00:00:00 CEST 2007"

Je pense que c'est le format de date qui bloque je vais essayer de travailler là dessus.
lolotte35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 14h22   #19
Membre éclairé
 
Avatar de bouvda
 
Inscription : octobre 2005
Messages : 252
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2005
Messages : 252
Points : 312
Points : 312
Envoyer un message via MSN à bouvda
Il suffit de faire :

Code :
1
2
3
UPDATE journal
SET date_debut= '"+(String)context.getProperty("date_debut")+"'
WHERE FONCTION ='CHARGEMENT' AND TRAITEMENT='CATALOGUE_INTERVENTION'
en effet, on veut la chaîne de caractères (qui est déjà au format YYYYMMDD) donc il n'y a pas besoin de repasser par un objet Date.
Je viens seulement de le voir alors que c'est évident pourtant .
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 15h32   #20
Nouveau Membre du Club
 
Inscription : juin 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 109
Points : 37
Points : 37
Merci, on y était presque.
Sous toad, il doit faire une conversion implicite de ma chaine de caractère en to_date.
J'ai eu un éclair tout à coup!


donc il fallait que je mette:

"update journal
set
date_debut= to_date('" + (String)context.getProperty("date_deb") + "','DDMMYYYY')
where FONCTION ='CHARGEMENT' and TRAITEMENT='CATALOGUE_INTERVENTION'"


et ça fonctionne!
merci en fait c'était un problème de conversion entre talend et Oracle.



Bonne journée bouvda
lolotte35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h39.


 
 
 
 
Partenaires

Hébergement Web