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 13/08/2007, 10h43   #1
Nouveau Membre du Club
 
Inscription : juin 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 109
Points : 37
Points : 37
Par défaut [Talend]t_map relier 2 tables avec 2 colonnes de libellés pas entièrement identiques

Bonjour,

J'ai un oracleinput et un postgressqlinput relié tous les deux à un T_map.
Le oracleinput ets en liaisaon "main" et le postgresinput en liaison "lookup".

Dans le oracleintput, je selectionne une table VEHICULE, son immatriculation et sa marque.

Dans le postgressql, je selectionne la table de référence des marques T_MARQUE, je rappatrie donc le libellé de la marque et son code.


Je dois relié les deux tables dans le t_map en disant que VEHICULE.marque doit être contenu dans T_MARQUE.lib_marque car les deux libellés ne sont pas identiques:
en oracle ça donnerait
VEHICULE.marque like '%T_MARQUE.lib_marque%'
en postgres
T_MARQUE.lib_marque *~ VEHICULE.marque


comment puis je dire dans un t_map que les colonnes pour réunir les 2 tables ne sont pas égales mais doivent juste contenir le mot de l'une dans l'autre ?

Merci
lolotte35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2007, 11h21   #2
Membre Expert
 
Avatar de Benoit_Durand
 
Benoit Durand
Consultant en Business Intelligence Freelance
Inscription : mars 2005
Messages : 817
Détails du profil
Informations personnelles :
Nom : Benoit Durand
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Consultant en Business Intelligence Freelance

Informations forums :
Inscription : mars 2005
Messages : 817
Points : 1 091
Points : 1 091
Bonjour,
Il faut mettre ton expression de jointure dans la colonne expr key au niveau de la jointure dans le tMap.
L'expression doit être en langage généré, donc java ou perl.
Tu utilises quel langage ?
Benoit_Durand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2007, 11h25   #3
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,

j'ai une petite idée : tu peux créer une routine qui va comparer les deux clés et retourner celle qu'il faut, comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package routines;
public class Cle {
   public static String Contient(String cleMain, String cleLookup) {
        //Test si le clé de la table principale (lien Main ) contient la clé de la table en Lookup
        if(cleMain.indexOf(cleLookup) > -1) {
            return cleLookup;
        }
        //sinon si la clé de la table en Lookup contient la clé de la table principale
        else if(cleLookup.indexOf(cleMain) > -1) {
            return cleLookup;
        }
        return cleMain;
    } 
}
Ensuite dans le tMap, il faut renseigner la colonne Expr. key de la table en lookup comme cela :
Code :
Cle.Contient(VEHICULE.marque,T_MARQUE.lib_marque)
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2007, 11h52   #4
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,

Ah oui, je pensais que dans l'expression key il parlait le langage du input.

Alors dans le t_map je n'arrive pas à mettre dans l'expression key la variable de mon lookup.

Je m'explique:

row1
immatriculation
marque


row2
id_marque
lib_marque

dans l'expression key de mon row2.lib_marque
je ne peux pas mettre :
Cle.Contient(row1.marque,T_MARQUE.lib_marque)
ou
Cle.Contient(row1.marque,row2.lib_marque)
ou
Cle.Contient(row1.marque,lib_marque)

il ne reconnait pas la deuxième paramètre
il dit qu'il ne peux pas résoudre T_marque ou row2 ou lib_marque....
lolotte35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2007, 11h53   #5
Nouveau Membre du Club
 
Inscription : juin 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 109
Points : 37
Points : 37
Citation:
Envoyé par Hebus_Beer
Bonjour,
Il faut mettre ton expression de jointure dans la colonne expr key au niveau de la jointure dans le tMap.
L'expression doit être en langage généré, donc java ou perl.
Tu utilises quel langage ?

J'utilise le langage java.
lolotte35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2007, 12h19   #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
Oui c'est vrai la variable de la table de lookup n'est pas encore connue à l'appel de la fonction...Tu peux essayer de ne faire aucune jointure sur les tables en entrée du tMap, puis d'appeler la fonction dans le filtre de la table en sortie du tMap.
Il faut alors que la fonction renvoie un booléen :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package routines;
public class Cle {
  public static boolean Contient(String cleMain, String cleLookup) {
        //Test si le clé de la table principale (lien Main ) contient la clé de la table en Lookup
        if(cleMain.indexOf(cleLookup) > -1) {
            return true;
        }
       //sinon si la clé de la table en Lookup contient la clé de la table principale
        else if(cleLookup.indexOf(cleMain) > -1) {
            return true;
        }
        return false;
    } 
}
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2007, 14h47   #7
Nouveau Membre du Club
 
Inscription : juin 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 109
Points : 37
Points : 37
ok je mets ça dans le t_map sur la table de sortie en filtre:
Code :
1
2
 
IcareConversion.contientCle(row1.MARQUE,row2.cod_marque)==true
Mais il renvoie true à toutes les lignes, car en sortie j'ai autant de lignes que dans la table T_marque
Est ce que je dois cochée une des flèches dans la tables de sortie?



sinon je voulais faire autrement:

t_oracleinput -> tJava -> t_postgressql -> t_map -> fichiersortie

dans le "tJava" je déclare
Code :
1
2
 
context.setProperty("marque_v",row1.MARQUE);
puis dans le t_potgressql je sélectionne les lignes avec un where
Code :
1
2
3
 
"select t_marque.id_marque, t_marque.cod_marque, t_marque.lib_marque
from public.t_marque where t_marque.cod_marque *~ \" + (String)context.getProperty(\"marque_v\") + "
mais ça plante à chaque fois, il fait l'erreur:


Exception in component tJava_2
java.lang.NullPointerException
at java.util.Hashtable.put(Unknown Source)
at java.util.Properties.setProperty(Unknown Source)



J'ai déjà utilisé des variables comme ça dans un tjava et ça fonctionnait...

est ce que je suis censé déclarer cette variable quelque part?
lolotte35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2007, 08h22   #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,

Citation:
Envoyé par lolotte35
ok je mets ça dans le t_map sur la table de sortie en filtre:
Code :
IcareConversion.contientCle(row1.MARQUE,row2.cod_marque)==true
Mais il renvoie true à toutes les lignes, car en sortie j'ai autant de lignes que dans la table T_marque
Est ce que je dois cochée une des flèches dans la tables de sortie?
Non il n'y a pas besoin de cocher une des flèches dans la table de sortie, il faut juste mettre le filtre.

Citation:
Envoyé par lolotte35
sinon je voulais faire autrement:

t_oracleinput -> tJava -> t_postgressql -> t_map -> fichiersortie

dans le "tJava" je déclare
Code :
1
2
 
context.setProperty("marque_v",row1.MARQUE);
puis dans le t_potgressql je sélectionne les lignes avec un where
Code :
1
2
3
 
"select t_marque.id_marque, t_marque.cod_marque, t_marque.lib_marque
from public.t_marque where t_marque.cod_marque *~ \" + (String)context.getProperty(\"marque_v\") + "
mais ça plante à chaque fois, il fait l'erreur:


Exception in component tJava_2
java.lang.NullPointerException
at java.util.Hashtable.put(Unknown Source)
at java.util.Properties.setProperty(Unknown Source)



J'ai déjà utilisé des variables comme ça dans un tjava et ça fonctionnait...

est ce que je suis censé déclarer cette variable quelque part?
Il faut déclarer ces variables dans le contexte du job. Le composant utilisé n'est pas le bon non plus, il faut utiliser le tJavaRow afin que l'instruction soit effectuée pour chaque enregistrement.
Aussi, dans le tPostgressql la requête n'est pas bonne car il ne faut pas échapper les doubles quotes :
Code :
1
2
"select t_marque.id_marque, t_marque.cod_marque, t_marque.lib_marque
from public.t_marque where t_marque.cod_marque *~ " + (String)context.getProperty("marque_v")
bouvda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2007, 09h21   #9
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,

super ça marche, j'avais essayé le t_javarow mais j'avais oublié de lister les variables dans le schéma!


Merci beaucoup!

Je trouve cela plus propre ma deuxième solution, c'est-à-dire :
le oracleinput -> le javarow ->le postgresqlinput -> le tmap-> la sortie


Merci encore et bonne journée
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 23h35.


 
 
 
 
Partenaires

Hébergement Web