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 16/11/2011, 17h21   #1
Invité de passage
 
Femme Perrine
Ingénieur d'études et développement
Inscription : novembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Femme Perrine
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur d'études et développement

Informations forums :
Inscription : novembre 2011
Messages : 6
Points : 1
Points : 1
Par défaut tMysqlRow, récupérer le nombre de lignes affectées ?

Bonjour,
j'espère que le sujet n'a pas déjà été abordé ailleurs, je n'ai pas trouvé de réponse à mon problème.

En bref :
j'utilise un tMysqlRow pour exécuter une requête de type "INSERT ... ON DUPLICATE KEY UPDATE"
Je voudrais savoir à la sortie de ce composant si j'ai inséré ou mis à jour mes données.
Je n'ai pas trouvé de petite variable miracle qui me donne cette info...
Dans la doc de MySQL je lis :
"With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row and 2 if an existing row is updated. "
Est-ce que je peux récupérer alors le nombre de lignes affectées ?

Merci pour vos réponses et votre attention, toute aide sera la bienvenue !
perrine1988 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 10h49   #2
Invité de passage
 
Femme Perrine
Ingénieur d'études et développement
Inscription : novembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Femme Perrine
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur d'études et développement

Informations forums :
Inscription : novembre 2011
Messages : 6
Points : 1
Points : 1
Bonjour,

devant la foultitude de réponses proposées, je vais exposer le problème autrement

En fait, je l'avais déjà "déplacé".
Initialement, je veux simplement récupérer le contenu d'un fichier CSV et pour chaque ligne, l'insérer ou la mettre à jour en BDD. A la sortie, je veux savoir combien de lignes ont été ajoutées, combien ont été mises à jour.
Jusque là, facile, tMysqlOuput sait le faire très facilement !

Là où ça se corse, c'est que je ne veux pas forcément mettre à jour tous les champs de la table : dans mon fichier, pour certains champs, un "?" indique que la valeur n'est pas à changer et doit absolument rester telle qu'elle était avant !
Je n'ai rien trouvé qui me permette de faire ça

Du coup, je filtre les lignes de façon à ne laisser passer que celles ou il n'y pas de "?" d'un côté, et de l'autre, je construis une requête "à la mano" et je l'envoie dans un tMysqlRow... c'est ce que j'expliquais dans mon post précédent !

Finalement, il y avait peut être une solution à mon problème initial ???
Toutes les suggestions seront les bienvenues, merci à tous !
perrine1988 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 12h35   #3
Membre du Club
 
Avatar de jnbarthas
 
Homme
Ingénieur développement logiciels
Inscription : août 2011
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 49
Points : 64
Points : 64
par rapport au PB initial:
Vous ajoutez un(ou plusieurs) flux input (lookup) avec les valeurs initiales de référence.
Pour faire des contrôles supplémentaires l'opérateur ternaire s'y prête bien.
Utilisez les var locales au tMap. Cela permet d'initialiser une variable avec une valeur par défaut (cas null ou "?") pour modifier ou non la valeur d'une variable dans le flux de sortie.

ex: input1.col1.equals("?") input2.refCol1 :input1.Col1

ATTENTION: contrôle à prévoir si input1.col1 peut prendre la valeur null
jnbarthas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 14h06   #4
Invité de passage
 
Femme Perrine
Ingénieur d'études et développement
Inscription : novembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Femme Perrine
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur d'études et développement

Informations forums :
Inscription : novembre 2011
Messages : 6
Points : 1
Points : 1
Bonjour jnbarthas, et merci pour cette réponse !

Etant novice avec cet outil, je ne suis pas sure d'avoir tout compris...

Mon flux est le tFileInputDelimited, qui me parse correctement mon fichier CSV en me transmettant les champs comme je souhaite.
Si je comprends bien, les contrôles supplémentaires doivent se faire dans le tMap ? Dans le champ "Expression" de la colonne de droite ? (je précise accessoirement que je suis en version Perl)
Mais dans ce cas, je modifie la valeur de mon champ à la sortie du tMap ?
Ce n'est pas ce que je souhaite, car il faudrait dans ce cas que je lui affecte la valeur qui se trouve en bdd...

Je veux pouvoir dire "si mon champ, pour la ligne que je suis en train de traiter, est égal à "?", tu mets a jour toute la ligne SAUF ce champ".
Est-ce bien ce que vous aviez compris ?
perrine1988 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 17h06   #5
Membre du Club
 
Avatar de jnbarthas
 
Homme
Ingénieur développement logiciels
Inscription : août 2011
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 49
Points : 64
Points : 64
Citation:
Envoyé par perrine1988 Voir le message
Si je comprends bien, les contrôles supplémentaires doivent se faire dans le tMap ? Dans le champ "Expression" de la colonne de droite ? (je précise accessoirement que je suis en version Perl)
Contrôle supplémentaire dans la partie centrale en ajoutant des Var et définissant des Expressions.
Attention PERL ne sera plus supporté en version 5

Citation:
Mais dans ce cas, je modifie la valeur de mon champ à la sortie du tMap ?
Ce n'est pas ce que je souhaite, car il faudrait dans ce cas que je lui affecte la valeur qui se trouve en bdd...
1erre solution
OUI; ajoutez un lien lookup vers les données cible (référence); faire une "left outer join" sur une clé du flux input CSV pour récupérer la valeur significative de référence du champ qui peut être à "?" dans le CSV.
Citation:
Je veux pouvoir dire "si mon champ, pour la ligne que je suis en train de traiter, est égal à "?", tu mets a jour toute la ligne SAUF ce champ".
Est-ce bien ce que vous aviez compris ?
NON, ce n'est pas possible ainsi.
MAIS 2eme solution
créer 2 flux de sortie
* 1 complet avec tous les champs
* 1 plus restreint pour ne pas écraser les champs avec valeurs non significatives du flux principal
activer un FILTRE (Var.critere == true) pour orienter vers l'un ou l'autre (Var.critere == false) des flux dans le tMap
La valeur de critère du filtre ((Var.critere de type boolean) est positionnée dans une Var locale selon les informations du flux CSV ("?", ...)


Si ce n'est pas assez clair, vous pouvez suivre les tuto sur le tMap, utiliser la doc technique ou consulter le livre disponible en version numérique (ENI).

Bonne continuation.
jnbarthas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 17h24   #6
Invité de passage
 
Femme Perrine
Ingénieur d'études et développement
Inscription : novembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Femme Perrine
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur d'études et développement

Informations forums :
Inscription : novembre 2011
Messages : 6
Points : 1
Points : 1
Merci pour cette deuxième réponse, et pour l'attention portée à mes questions !!

Pour ce qui est de la 2ème solution, j'y avais pensé dans un premier temps. Ce serait envisageable si je n'avais qu'un seul champ, mais comme j'en ai plusieurs, il faudrait que je considère chaque combinaison possible et ce serait simplement affreux...

Pour la 1ère solution, celle qui consiste à aller chercher en base les données qui doivent remplacer le '?', elle me semble fort couteuse en termes de process !?
Mon "INSERT ... ON DUPLICATE KEY ... " est finalement plus économe, ne peut-on réellement pas récupérer le "affected-rows" ?
perrine1988 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 09h41   #7
Membre du Club
 
Avatar de jnbarthas
 
Homme
Ingénieur développement logiciels
Inscription : août 2011
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 49
Points : 64
Points : 64
le composant de type "row" ne génère pas de flux de sortie; pas d'info sur nb lignes affectées.
Si la solution 1 vous parait couteuse, vous pouvez tout de même l'optimiser.
- décomposer avec un premier tMap pour enrichir le flux principal CSV des infos complémentaires nécessaires
- utiliser du SQL pur dans du code java (routine) et connaitre le nb de lignes affectées, tout en partageant les mêmes curseurs...
jnbarthas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 13h48   #8
Invité de passage
 
Femme Perrine
Ingénieur d'études et développement
Inscription : novembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Femme Perrine
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur d'études et développement

Informations forums :
Inscription : novembre 2011
Messages : 6
Points : 1
Points : 1
Merci encore,

J'ai finalement opté pour le SQL pur dans du code.. Perl puisque nous sommes toujours en Perl.

En parlant de Perl, peut-être que j'ai de sérieux problèmes de vue mais je ne trouve nulle part sur le site de Talend l'info concernant la version 5.
Il s'agit d'un point important car nous avons un certain nombre de process sous Talend version Perl et une solution devra être envisagée rapidement.
Pourriez-vous m'indiquer une page sur laquelle m'appuyer pour faire passer l'info au sein de nos équipes ?
Merci encore pour votre aide et votre attention !
perrine1988 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 17h19   #9
Membre du Club
 
Avatar de jnbarthas
 
Homme
Ingénieur développement logiciels
Inscription : août 2011
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 49
Points : 64
Points : 64
je ne travaille pas pour TALEND. Je suis avant tout un utilisateur enthousiaste du produit (disponible pour du conseil ou des formations).

J'ai appris que PERL est en mode "deprecated" en version 4.2 et doit disparaitre avec la version 5.

http://www.talendforge.org/forum/viewtopic.php?id=15654

Bon WE.
jnbarthas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 10h49   #10
Invité de passage
 
Femme Perrine
Ingénieur d'études et développement
Inscription : novembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Femme Perrine
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur d'études et développement

Informations forums :
Inscription : novembre 2011
Messages : 6
Points : 1
Points : 1
Merci beaucoup pour ces réponses et l'aide apportée.

Je marque le topic comme résolu bien qu'il soit plutôt contourné, et communiquerai l'information concernant Perl à mes collaborateurs.

Merci & bonne continuation.
perrine1988 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h03.


 
 
 
 
Partenaires

Hébergement Web