IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement de jobs Discussion :

Compter le nombre de "cases" remplies dans une table


Sujet :

Développement de jobs

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Compter le nombre de "cases" remplies dans une table
    Bonjour,

    J'ai la table suivante :

    +----------+-------------+--------+
    | Nom | Ville | Age |
    +----------+-------------+--------+
    | Alice | Orléans | 22 |
    | Bertrand | Orléans | |
    | Caroline | Paris | 23 |
    | Denise | | |
    | Estelle | | |
    | Fabrice | Montpellier | 24 |
    +----------+-------------+--------+

    J'aimerai créer un job qui compte le nombre d'occurences remplies (non null) pour chaque champ et obtenir la sortie suivante :

    +-------+------------+-------------+
    | Champ | Nb absents | Nb presents |
    +-------+------------+-------------+
    | Nom | 0 | 6 |
    | Ville | 2 | 4 |
    | Age | 3 | 3 |
    +-------+------------+-------------+

    Si possible, j'aimerai que le job analyse la table en entrée pour extraire les noms de champs (car en réalité les tables que je dois analyser peuvent compter plus d'une centaine de champs)


    Merci d'avance pour votre aide.

    B.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Architecte Décisionnel
    Inscrit en
    Février 2008
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte Décisionnel

    Informations forums :
    Inscription : Février 2008
    Messages : 866
    Points : 1 260
    Points
    1 260
    Par défaut
    Essaie peut-être de regarder ce que tu peux faire avec le Talend Open Profiler.
    Il me semble que c'est justement ce qu'il fait.

    C'est un produit gratuit de Talend, comme le Talend Open Studio.

    Nicolas

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour et merci pour ta réponse,

    Avant de publier ce post, j'avais en effet regardé du côte de TOP. Seulement, si TOP arrive à faire le compte des "cases" remplies", il ne permet pas l'export (d'après ce que j'ai vu) des résultats sous forme exploitable (fichiers excel, csv etc.).

    C'est pour ça que je préfèrerai utiliser TOS.

    Donc ma demande reste d'actualité

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Si TOP ne permet pas les exports que tu veux, c'est pour une raison commerciale : Talend vend les versions "professionnalisées" de ses produits Open Source.

    Pour ton besoin (export des résultats compris), il faut te diriger vers TDQ (Talend Data Quality)... mais bien sûr, il faudra sortir le porte-monnaie au passage.

    Pour implémenter ce comptage dans TOS, c'est loin d'être insurmontable : il faut juste passer par un/des compteurs, ce qui se fait très bien :
    - soit en utilisant la "globalMap" pour stocker des compteurs
    - soit en utilisant des filtres (tFilterRow)

    Il faut savoir que presque tous les composants Talend stockent de manière "cachée" le nombre de lignes qu'ils ont vu passer (dont le tFilterRow qui peut donc après exécution "dire" combien de ligne ont été filtrées).

    Ces résultats sont aussi stockées dans la globalMap.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Architecte Décisionnel
    Inscrit en
    Février 2008
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte Décisionnel

    Informations forums :
    Inscription : Février 2008
    Messages : 866
    Points : 1 260
    Points
    1 260
    Par défaut
    Pour compléter ce que dit CyberChouan, je pense qu'il te faudra regarder dans les tables système de ta base de données pour récupérer dans un premier temps les noms des tables ainsi que les noms de colonne de chaque table.
    Ainsi tu pourras automatiser le process et générer dynamiquement le tableau avec une ligne par colonne de chaque table.

    Nicolas

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci pour vos réponses, je vais essayer de mettre vos conseils en application

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut
    N'y aurait-il pas moyen de le faire via TOS?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [table]=>tMap=>tAggregateRow=>[tFile ou tBDD]
    je rajouterais trois colonnes via un tMap dans ton cas:
    -une colonne NomAbsent où je mettrais la valeur 1 si le nom est vide
    -une colonne AgeAbsent avec le même mode de remplissage
    -une colonne VilleAbsente

    Après le tMap, j'effectuerais une agrégation par somme avec une colonne
    nbNomAbsent avec un mode d'agrégation par somme
    nbAgeAbsent
    nbVilleAbsente

    La différence c'est que tu auras les données en colonne et non en ligne comme tu sembles vouloir le faire...

  8. #8
    Membre actif
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Points : 248
    Points
    248
    Par défaut
    Il y avait comme solution proposée :
    utiliser la "globalMap" pour stocker des compteurs.

    Pouvez-vous détailler svp ?

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut
    Avec la méthode par variable globale,
    -on initialise une variable compteur par colonne.
    Ex: compteurNom pour les noms vides
    -qu'on alimente, dans ton cas, seulement si l'on rencontre une case remplie...

    Le job ressemblerait à cela:
    [TABLE]=(main)=>tJavaRow
    =(onSubObjOk)=>tJavaRow=(main)=>tSortie


    Ce qui donnerait quelque-chose de ce genre au sein du premier tJavaRow:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (!input_row.nom.equals(""))?(((Integer)globalMap.get("compteurNom"))++):(((Integer)globalMap.get("compteurNom")))
    A faire pour chaque colonne: ville, age...
    Sinon, la condition est à tester, je ne suis pas sûr...

    Et dans le deuxième tJavaRow
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    output_row.nbNomsVides=((Integer)globalMap.get("compteurNom"));

  10. #10
    Membre actif
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Points : 248
    Points
    248
    Par défaut
    1) je ne trouve pas de doc sur le composant tJavaRow ( rien dans TalendOpenStudio_Components_RG_32a_FR.pdf )

    Y en a t-il quelque part ?

    2) variable globale : est-ce le composant tSetGlobalVar dont il s'agit ?

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut
    Il y a plusieurs composants qui permettent d'écrire du Java:
    • tJava : un composant "statique" qui ne récupère ni ne génére aucun flux.
    • tJavaRow : est un composant qui, lui, peut récupérer et générer des flux.
    • tJavaFlex : semblable au tJavaRow sauf qu'il permet de découpler un flux entrant en n flux sortants grâce à un mécanisme de boucles appliquées au flux entrant.


    Pour récupérer le contenu d'un flux dans un tJavaRow:
    input_row.nomColonne
    Pour générer un flux:
    output_row.nomColonne

    tSetGlobalVar te sert à initialiser une variable globale mais tu peux très bien créer une variable de cette façon: globalMap.put("taVariable",taValeur) au sein d'un tJavaRow sans employer de composant tSetglobalVar.

  12. #12
    Membre actif
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Points : 248
    Points
    248
    Par défaut
    Je reviens sur :
    globalMap.put("taVariable",taValeur) au sein d'un tJavaRow :

    A quel endroit cela se met cette déclaration de variable ?

    J'ai cru comprendre que ce n'était pas dans le code de Basic settings car ce dernier est fait pour chaque itération ( et c'est là que j'incrementerai mon compteur)

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut
    Si, si, c'est bien dans la partie basic settings que tu mets ton code Java.
    cf copie d'écran
    Images attachées Images attachées  

  14. #14
    Membre actif
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Points : 248
    Points
    248
    Par défaut
    Il s'agit du basic settings de quel objet ?

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut
    du tJavaRow

  16. #16
    Membre actif
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Points : 248
    Points
    248
    Par défaut
    Je ne comprends pas :
    pour moi , j'ai 2 codes à mettre :
    1er code : initialiser mon compteur
    2ème code : incrémenter mon compteur (mon tjavarow est relié à un composant postgresql)

    où dois-je mettre le 1er code ?
    le 2ème ?

    Dois-je créer 2 tJavaRow ?

  17. #17
    Membre actif
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Points : 248
    Points
    248
    Par défaut
    ( je travaille en benfel sur le même projet)

    J'ai créé une vue SQL qui me liste tous les champs des tables de ma BD.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT pg_class.relname::text AS relname, pg_attribute.attnum, pg_attribute.attname::text AS attname
       FROM pg_class
       JOIN pg_attribute ON pg_class.oid = pg_attribute.attrelid
      WHERE pg_class.relkind = 'r'::"char" AND pg_class.relname !~~ 'pg_%'::text AND pg_attribute.attnum > 0 AND pg_attribute.atttypid <> 0::oid;

    relname est le nom de la table
    attnum est le nom d'un champ de la table

    cf quelques enregs de la vue sur image jointe

    Je voudrais :
    1) demander à l'utilisateur de saisir le nom d'une table
    --> ok avec tMsgBox
    2) filtrer dans ma vue pour ne prendre que les lignes qui affichent les champs de la table
    --> ok avec tFilterRox

    et là ça se complique :

    3) avec tJavaFlex , créer une sortie (csv par exemple) avec 2 colonnes :

    Nom_champ
    nb_occurrences_remplies

    exemple : si je prends la table acpnirsderiv :

    Nom_champ ; nb_occurences_remplies
    no_site;2500 --> 2500 enreg dans acpnirsderiv avec no_site non null
    no_prof_base ; 2490 --> 2490 enreg avec no_prof_base non null
    no_horizon; 2495
    ... etc pour tous les champs de la table acpnirsderiv
    Images attachées Images attachées  

  18. #18
    Membre actif
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Points : 248
    Points
    248
    Par défaut
    Nous avons résolu le problème de la façon suivante :

    1er composant tPostgresqlInput qui pointe sur ma table SQL qui contient les champs des tables de ma BD.
    On le fait pointer ( en row1(main) ) sur un composant tFlowIterate ( qui contient 3 champs : nom_schema, non_table, nom_champ.
    On fait pointer tFlowIterate ( en Iterate ) sur un composant tPostgresqlInput qui contient 4 champs : nom_schema, non_table, nom_champ, nb_enreg.
    Ce composant tPostgresqlInput est défini de la façon suivante :

    - schema : (String)globalMap.get("nom_schema")

    - requete :
    "SELECT '" + (String)globalMap.get("nom_schema") + "' AS nom_schema ,'" + (String)globalMap.get("nom_table") + "' AS nom_table ,'" + (String)globalMap.get("nom_champ") + "' AS nom_champ,COUNT(*) AS nb_enreg FROM \"" + (String)globalMap.get("nom_table") + "\" WHERE " + (String)globalMap.get("nom_champ") + " is not null"

    On fait pointer ce 2ème tPostgresqlInput sur un composant tUnite ( en Merge )

    Puis on met par exemple un tFileOutputDelimited pour afficher le résultat
    Images attachées Images attachées  

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/09/2017, 22h15
  2. Compter le nombre d'occurences d'un mot dans une table
    Par Scots dans le forum Requêtes
    Réponses: 0
    Dernier message: 11/03/2011, 09h36
  3. Réponses: 2
    Dernier message: 18/04/2008, 16h19
  4. Réponses: 4
    Dernier message: 04/06/2007, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo