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

Discussion: Left join avec HASH

  1. #1
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    juillet 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : juillet 2011
    Messages : 412
    Points : 1 033
    Points
    1 033
    Billets dans le blog
    13

    Par défaut Left join avec HASH

    Bonjour,

    Je veux faire un left join avec HASH.
    Pourriez vous, svp, me dire pourquoi le 8 et 9 de la table A ne sont pas dans la table resultat_hash?
    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    data  a ;
    input key adata adata2 ;
    cards ;
    1 1 2
    1 1 3
    2 2 5
    8 7 5
    9 5 4
    ;
    run ;
     
    data b ;
    input key bdata ;
    cards ;
    1 11
    1 12
    3 31
    4 4
    6 61
    6 62
    6 63
    7 7
    ;
    run ;
     
     
    proc sql;
    create table resultat_sql as select a.*,b.bdata
    from a left join b on a.key=b.key;
    quit;
     
     
    data resultat_hash;
     if 0 then set a ;
     dcl hash b (dataset: "a", multidata: "y",ordered:'y') ;
     b.definekey ("key") ;
     b.definedata (all:'y') ;
     b.definedone () ;
      do until(eof);
       set b end=eof;
       rc=b.find();
       if rc ne 0 then do;
    	call missing(bdata);
    	output;
    	end;
       else 
        do  while(rc eq 0);
         output;
    	 rc=b.find_next();
        end;
     end;
    stop;
     
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : décembre 2013
    Messages : 198
    Points : 636
    Points
    636

    Par défaut

    Bonjour,

    Avec ton Hash tu réalises un left join avec B à gauche, or tu n'as pas 8 et 9 dans cette table.

    Si ton but c'est de réaliser la même opération qu'avec ta proc SQL tu dois faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    data resultat_hash;
    If _n_ = 1 then do;
     if 0 then set b ;
     dcl hash b (dataset: "b", multidata: "y",ordered:'y') ;
     b.definekey ("key") ;
     b.definedata (all:'y') ;
     b.definedone () ;
    End;
       set a end=eof;
       rc=b.find();
    	if rc ne 0 then do;
    		call missing(bdata);
    		output;
    	end;
        else do  while(rc eq 0);
    	    output;
    		rc=b.find_next();
        end;
    run;
    Flo00154

  3. #3
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    juillet 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : juillet 2011
    Messages : 412
    Points : 1 033
    Points
    1 033
    Billets dans le blog
    13

    Par défaut

    Merci Flo pour ta réponse, j'ai pensé à cette solution, mais d'après ma compréhension des objets HASH, les données chargées en mémoire sont les données de la table déclarée dans l'objet
    J'ai 10000 lignes dans la table A et 5 Millions d’observations dans la table B.
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

Discussions similaires

  1. Left join avec plusieurs table & plusieurs champs
    Par jayfaze dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 16/12/2009, 16h01
  2. Faire un Left join avec pro*C
    Par xoum89 dans le forum SQL
    Réponses: 4
    Dernier message: 15/05/2009, 08h54
  3. left join avec max(date)
    Par supernicoco dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/10/2008, 09h53
  4. Left join avec 3 tables
    Par MathiasMathias dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/04/2007, 01h45
  5. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 17h38

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