Apache Pig - Opérateur de jointure
le JOINL'opérateur est utilisé pour combiner des enregistrements de deux ou plusieurs relations. Lors de l'exécution d'une opération de jointure, nous déclarons un (ou un groupe de) tuple (s) de chaque relation, comme clés. Lorsque ces clés correspondent, les deux tuples particuliers sont mis en correspondance, sinon les enregistrements sont supprimés. Les jointures peuvent être des types suivants -
- Self-join
- Inner-join
- Jointure externe - jointure gauche, jointure droite et jointure complète
Ce chapitre explique à l'aide d'exemples comment utiliser l'opérateur de jointure en Pig Latin. Supposons que nous ayons deux fichiers à savoircustomers.txt et orders.txt dans le /pig_data/ répertoire de HDFS comme indiqué ci-dessous.
customers.txt
1,Ramesh,32,Ahmedabad,2000.00
2,Khilan,25,Delhi,1500.00
3,kaushik,23,Kota,2000.00
4,Chaitali,25,Mumbai,6500.00
5,Hardik,27,Bhopal,8500.00
6,Komal,22,MP,4500.00
7,Muffy,24,Indore,10000.00
orders.txt
102,2009-10-08 00:00:00,3,3000
100,2009-10-08 00:00:00,3,1500
101,2009-11-20 00:00:00,2,1560
103,2008-05-20 00:00:00,4,2060
Et nous avons chargé ces deux fichiers dans Pig avec les relations customers et orders comme indiqué ci-dessous.
grunt> customers = LOAD 'hdfs://localhost:9000/pig_data/customers.txt' USING PigStorage(',')
as (id:int, name:chararray, age:int, address:chararray, salary:int);
grunt> orders = LOAD 'hdfs://localhost:9000/pig_data/orders.txt' USING PigStorage(',')
as (oid:int, date:chararray, customer_id:int, amount:int);
Exécutons maintenant diverses opérations de jointure sur ces deux relations.
Auto-rejoindre
Self-join est utilisé pour joindre une table avec elle-même comme si la table était deux relations, en renommant temporairement au moins une relation.
Généralement, dans Apache Pig, pour effectuer une auto-jointure, nous chargerons les mêmes données plusieurs fois, sous différents alias (noms). Chargez donc le contenu du fichiercustomers.txt comme deux tableaux comme indiqué ci-dessous.
grunt> customers1 = LOAD 'hdfs://localhost:9000/pig_data/customers.txt' USING PigStorage(',')
as (id:int, name:chararray, age:int, address:chararray, salary:int);
grunt> customers2 = LOAD 'hdfs://localhost:9000/pig_data/customers.txt' USING PigStorage(',')
as (id:int, name:chararray, age:int, address:chararray, salary:int);
Syntaxe
Vous trouverez ci-dessous la syntaxe de l'exécution self-join opération utilisant le JOIN opérateur.
grunt> Relation3_name = JOIN Relation1_name BY key, Relation2_name BY key ;
Exemple
Laissez-nous performer self-join opération sur la relation customers, en joignant les deux relations customers1 et customers2 comme indiqué ci-dessous.
grunt> customers3 = JOIN customers1 BY id, customers2 BY id;
Vérification
Vérifier la relation customers3 en utilisant le DUMP opérateur comme indiqué ci-dessous.
grunt> Dump customers3;
Production
Il produira la sortie suivante, affichant le contenu de la relation customers.
(1,Ramesh,32,Ahmedabad,2000,1,Ramesh,32,Ahmedabad,2000)
(2,Khilan,25,Delhi,1500,2,Khilan,25,Delhi,1500)
(3,kaushik,23,Kota,2000,3,kaushik,23,Kota,2000)
(4,Chaitali,25,Mumbai,6500,4,Chaitali,25,Mumbai,6500)
(5,Hardik,27,Bhopal,8500,5,Hardik,27,Bhopal,8500)
(6,Komal,22,MP,4500,6,Komal,22,MP,4500)
(7,Muffy,24,Indore,10000,7,Muffy,24,Indore,10000)
Jointure interne
Inner Joinest utilisé assez fréquemment; il est également appeléequijoin. Une jointure interne renvoie des lignes lorsqu'il existe une correspondance dans les deux tables.
Il crée une nouvelle relation en combinant les valeurs de colonne de deux relations (disons A et B) basées sur le prédicat de jointure. La requête compare chaque ligne de A avec chaque ligne de B pour trouver toutes les paires de lignes qui satisfont le prédicat de jointure. Lorsque le prédicat de jointure est satisfait, les valeurs de colonne pour chaque paire correspondante de lignes de A et B sont combinées dans une ligne de résultat.
Syntaxe
Voici la syntaxe de l'exécution inner join opération utilisant le JOIN opérateur.
grunt> result = JOIN relation1 BY columnname, relation2 BY columnname;
Exemple
Laissez-nous performer inner join opération sur les deux relations customers et orders comme indiqué ci-dessous.
grunt> coustomer_orders = JOIN customers BY id, orders BY customer_id;
Vérification
Vérifier la relation coustomer_orders en utilisant le DUMP opérateur comme indiqué ci-dessous.
grunt> Dump coustomer_orders;
Production
Vous obtiendrez la sortie suivante qui présentera le contenu de la relation nommée coustomer_orders.
(2,Khilan,25,Delhi,1500,101,2009-11-20 00:00:00,2,1560)
(3,kaushik,23,Kota,2000,100,2009-10-08 00:00:00,3,1500)
(3,kaushik,23,Kota,2000,102,2009-10-08 00:00:00,3,3000)
(4,Chaitali,25,Mumbai,6500,103,2008-05-20 00:00:00,4,2060)
Note -
Jointure externe : contrairement à la jointure interne,outer joinrenvoie toutes les lignes d'au moins une des relations. Une opération de jointure externe est effectuée de trois manières:
- Jointure externe gauche
- Jointure externe droite
- Jointure externe complète
Jointure externe gauche
le left outer Join L'opération renvoie toutes les lignes de la table de gauche, même s'il n'y a aucune correspondance dans la relation de droite.
Syntaxe
Vous trouverez ci-dessous la syntaxe de l'exécution left outer join opération utilisant le JOIN opérateur.
grunt> Relation3_name = JOIN Relation1_name BY id LEFT OUTER, Relation2_name BY customer_id;
Exemple
Réalisons l'opération de jointure externe gauche sur les deux relations clients et commandes comme indiqué ci-dessous.
grunt> outer_left = JOIN customers BY id LEFT OUTER, orders BY customer_id;
Vérification
Vérifier la relation outer_left en utilisant le DUMP opérateur comme indiqué ci-dessous.
grunt> Dump outer_left;
Production
Il produira la sortie suivante, affichant le contenu de la relation outer_left.
(1,Ramesh,32,Ahmedabad,2000,,,,)
(2,Khilan,25,Delhi,1500,101,2009-11-20 00:00:00,2,1560)
(3,kaushik,23,Kota,2000,100,2009-10-08 00:00:00,3,1500)
(3,kaushik,23,Kota,2000,102,2009-10-08 00:00:00,3,3000)
(4,Chaitali,25,Mumbai,6500,103,2008-05-20 00:00:00,4,2060)
(5,Hardik,27,Bhopal,8500,,,,)
(6,Komal,22,MP,4500,,,,)
(7,Muffy,24,Indore,10000,,,,)
Jointure externe droite
le right outer join L'opération renvoie toutes les lignes de la table de droite, même s'il n'y a aucune correspondance dans la table de gauche.
Syntaxe
Vous trouverez ci-dessous la syntaxe de l'exécution right outer join opération utilisant le JOIN opérateur.
grunt> outer_right = JOIN customers BY id RIGHT, orders BY customer_id;
Exemple
Laissez-nous performer right outer join opération sur les deux relations customers et orders comme indiqué ci-dessous.
grunt> outer_right = JOIN customers BY id RIGHT, orders BY customer_id;
Vérification
Vérifier la relation outer_right en utilisant le DUMP opérateur comme indiqué ci-dessous.
grunt> Dump outer_right
Production
Il produira la sortie suivante, affichant le contenu de la relation outer_right.
(2,Khilan,25,Delhi,1500,101,2009-11-20 00:00:00,2,1560)
(3,kaushik,23,Kota,2000,100,2009-10-08 00:00:00,3,1500)
(3,kaushik,23,Kota,2000,102,2009-10-08 00:00:00,3,3000)
(4,Chaitali,25,Mumbai,6500,103,2008-05-20 00:00:00,4,2060)
Jointure externe complète
le full outer join L'opération retourne des lignes lorsqu'il y a une correspondance dans l'une des relations.
Syntaxe
Vous trouverez ci-dessous la syntaxe de l'exécution full outer join en utilisant le JOIN opérateur.
grunt> outer_full = JOIN customers BY id FULL OUTER, orders BY customer_id;
Exemple
Laissez-nous performer full outer join opération sur les deux relations customers et orders comme indiqué ci-dessous.
grunt> outer_full = JOIN customers BY id FULL OUTER, orders BY customer_id;
Vérification
Vérifier la relation outer_full en utilisant le DUMP opérateur comme indiqué ci-dessous.
grun> Dump outer_full;
Production
Il produira la sortie suivante, affichant le contenu de la relation outer_full.
(1,Ramesh,32,Ahmedabad,2000,,,,)
(2,Khilan,25,Delhi,1500,101,2009-11-20 00:00:00,2,1560)
(3,kaushik,23,Kota,2000,100,2009-10-08 00:00:00,3,1500)
(3,kaushik,23,Kota,2000,102,2009-10-08 00:00:00,3,3000)
(4,Chaitali,25,Mumbai,6500,103,2008-05-20 00:00:00,4,2060)
(5,Hardik,27,Bhopal,8500,,,,)
(6,Komal,22,MP,4500,,,,)
(7,Muffy,24,Indore,10000,,,,)
Utilisation de plusieurs clés
Nous pouvons effectuer l'opération JOIN en utilisant plusieurs clés.
Syntaxe
Voici comment vous pouvez effectuer une opération JOIN sur deux tables à l'aide de plusieurs clés.
grunt> Relation3_name = JOIN Relation2_name BY (key1, key2), Relation3_name BY (key1, key2);
Supposons que nous ayons deux fichiers à savoir employee.txt et employee_contact.txt dans le /pig_data/ répertoire de HDFS comme indiqué ci-dessous.
employee.txt
001,Rajiv,Reddy,21,programmer,003
002,siddarth,Battacharya,22,programmer,003
003,Rajesh,Khanna,22,programmer,003
004,Preethi,Agarwal,21,programmer,003
005,Trupthi,Mohanthy,23,programmer,003
006,Archana,Mishra,23,programmer,003
007,Komal,Nayak,24,teamlead,002
008,Bharathi,Nambiayar,24,manager,001
employee_contact.txt
001,9848022337,[email protected],Hyderabad,003
002,9848022338,[email protected],Kolkata,003
003,9848022339,[email protected],Delhi,003
004,9848022330,[email protected],Pune,003
005,9848022336,[email protected],Bhuwaneshwar,003
006,9848022335,[email protected],Chennai,003
007,9848022334,[email protected],trivendram,002
008,9848022333,[email protected],Chennai,001
Et nous avons chargé ces deux fichiers dans Pig avec des relations employee et employee_contact comme indiqué ci-dessous.
grunt> employee = LOAD 'hdfs://localhost:9000/pig_data/employee.txt' USING PigStorage(',')
as (id:int, firstname:chararray, lastname:chararray, age:int, designation:chararray, jobid:int);
grunt> employee_contact = LOAD 'hdfs://localhost:9000/pig_data/employee_contact.txt' USING PigStorage(',')
as (id:int, phone:chararray, email:chararray, city:chararray, jobid:int);
Maintenant, joignons le contenu de ces deux relations en utilisant le JOIN opérateur comme indiqué ci-dessous.
grunt> emp = JOIN employee BY (id,jobid), employee_contact BY (id,jobid);
Vérification
Vérifier la relation emp en utilisant le DUMP opérateur comme indiqué ci-dessous.
grunt> Dump emp;
Production
Il produira la sortie suivante, affichant le contenu de la relation nommée emp comme indiqué ci-dessous.
(1,Rajiv,Reddy,21,programmer,113,1,9848022337,[email protected],Hyderabad,113)
(2,siddarth,Battacharya,22,programmer,113,2,9848022338,[email protected],Kolka ta,113)
(3,Rajesh,Khanna,22,programmer,113,3,9848022339,[email protected],Delhi,113)
(4,Preethi,Agarwal,21,programmer,113,4,9848022330,[email protected],Pune,113)
(5,Trupthi,Mohanthy,23,programmer,113,5,9848022336,[email protected],Bhuwaneshw ar,113)
(6,Archana,Mishra,23,programmer,113,6,9848022335,[email protected],Chennai,113)
(7,Komal,Nayak,24,teamlead,112,7,9848022334,[email protected],trivendram,112)
(8,Bharathi,Nambiayar,24,manager,111,8,9848022333,[email protected],Chennai,111)