Apache Pig - Partecipa all'operatore

Il JOINL'operatore viene utilizzato per combinare i record di due o più relazioni. Durante l'esecuzione di un'operazione di join, dichiariamo una (o un gruppo di) tuple da ciascuna relazione, come chiavi. Quando queste chiavi corrispondono, le due tuple particolari vengono abbinate, altrimenti i record vengono eliminati. I join possono essere dei seguenti tipi:

  • Self-join
  • Inner-join
  • Outer-join: join sinistro, join destro e join completo

Questo capitolo spiega con esempi come utilizzare l'operatore di join in Pig Latin. Supponiamo di avere due file, vale a direcustomers.txt e orders.txt nel /pig_data/ directory di HDFS come mostrato di seguito.

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

E abbiamo caricato questi due file in Pig con le relazioni customers e orders come mostrato di seguito.

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);

Eseguiamo ora varie operazioni di join su queste due relazioni.

Autoadesione

Self-join serve per unire una tabella a se stessa come se la tabella fosse due relazioni, rinominando temporaneamente almeno una relazione.

Generalmente, in Apache Pig, per eseguire l'auto-join, caricheremo gli stessi dati più volte, con diversi alias (nomi). Quindi cariciamo il contenuto del filecustomers.txt come due tabelle come mostrato di seguito.

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);

Sintassi

Di seguito è riportata la sintassi dell'esecuzione self-join operazione utilizzando il JOIN operatore.

grunt> Relation3_name = JOIN Relation1_name BY key, Relation2_name BY key ;

Esempio

Cerchiamo di esibirci self-join operazione sulla relazione customers, unendo le due relazioni customers1 e customers2 come mostrato di seguito.

grunt> customers3 = JOIN customers1 BY id, customers2 BY id;

Verifica

Verifica la relazione customers3 usando il DUMP operatore come mostrato di seguito.

grunt> Dump customers3;

Produzione

Produrrà il seguente output, visualizzando il contenuto della relazione 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)

Inner Join

Inner Joinè usato abbastanza frequentemente; è indicato anche comeequijoin. Un join interno restituisce righe quando c'è una corrispondenza in entrambe le tabelle.

Crea una nuova relazione combinando i valori di colonna di due relazioni (diciamo A e B) in base al predicato di join. La query confronta ogni riga di A con ogni riga di B per trovare tutte le coppie di righe che soddisfano il predicato di join. Quando il predicato di join è soddisfatto, i valori di colonna per ciascuna coppia di righe di A e B abbinate vengono combinati in una riga di risultati.

Sintassi

Ecco la sintassi dell'esecuzione inner join operazione utilizzando il JOIN operatore.

grunt> result = JOIN relation1 BY columnname, relation2 BY columnname;

Esempio

Cerchiamo di esibirci inner join operazione sulle due relazioni customers e orders come mostrato di seguito.

grunt> coustomer_orders = JOIN customers BY id, orders BY customer_id;

Verifica

Verifica la relazione coustomer_orders usando il DUMP operatore come mostrato di seguito.

grunt> Dump coustomer_orders;

Produzione

Otterrai il seguente output che sarà il contenuto della relazione denominata 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 -

Outer Join : a differenza di inner join,outer joinrestituisce tutte le righe di almeno una delle relazioni. Un'operazione di unione esterna viene eseguita in tre modi:

  • Giunzione esterna sinistra
  • Giunto esterno destro
  • Giunzione esterna completa

Join esterno sinistro

Il left outer Join l'operazione restituisce tutte le righe dalla tabella di sinistra, anche se non ci sono corrispondenze nella relazione di destra.

Sintassi

Di seguito è riportata la sintassi dell'esecuzione left outer join operazione utilizzando il JOIN operatore.

grunt> Relation3_name = JOIN Relation1_name BY id LEFT OUTER, Relation2_name BY customer_id;

Esempio

Eseguiamo un'operazione di join esterno sinistro sui due clienti e ordini di relazioni come mostrato di seguito.

grunt> outer_left = JOIN customers BY id LEFT OUTER, orders BY customer_id;

Verifica

Verifica la relazione outer_left usando il DUMP operatore come mostrato di seguito.

grunt> Dump outer_left;

Produzione

Produrrà il seguente output, visualizzando il contenuto della relazione 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,,,,)

Right Outer Join

Il right outer join operazione restituisce tutte le righe dalla tabella di destra, anche se non ci sono corrispondenze nella tabella di sinistra.

Sintassi

Di seguito è riportata la sintassi dell'esecuzione right outer join operazione utilizzando il JOIN operatore.

grunt> outer_right = JOIN customers BY id RIGHT, orders BY customer_id;

Esempio

Cerchiamo di esibirci right outer join operazione sulle due relazioni customers e orders come mostrato di seguito.

grunt> outer_right = JOIN customers BY id RIGHT, orders BY customer_id;

Verifica

Verifica la relazione outer_right usando il DUMP operatore come mostrato di seguito.

grunt> Dump outer_right

Produzione

Produrrà il seguente output, visualizzando il contenuto della relazione 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)

Join esterno completo

Il full outer join operazione restituisce righe quando c'è una corrispondenza in una delle relazioni.

Sintassi

Di seguito è riportata la sintassi dell'esecuzione full outer join usando il JOIN operatore.

grunt> outer_full = JOIN customers BY id FULL OUTER, orders BY customer_id;

Esempio

Cerchiamo di esibirci full outer join operazione sulle due relazioni customers e orders come mostrato di seguito.

grunt> outer_full = JOIN customers BY id FULL OUTER, orders BY customer_id;

Verifica

Verifica la relazione outer_full usando il DUMP operatore come mostrato di seguito.

grun> Dump outer_full;

Produzione

Produrrà il seguente output, visualizzando il contenuto della relazione 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,,,,)

Utilizzo di più chiavi

Possiamo eseguire l'operazione JOIN utilizzando più chiavi.

Sintassi

Ecco come eseguire un'operazione JOIN su due tabelle utilizzando più chiavi.

grunt> Relation3_name = JOIN Relation2_name BY (key1, key2), Relation3_name BY (key1, key2);

Supponiamo di avere due file, vale a dire employee.txt e employee_contact.txt nel /pig_data/ directory di HDFS come mostrato di seguito.

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

E abbiamo caricato questi due file in Pig con le relazioni employee e employee_contact come mostrato di seguito.

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);

Ora, uniamo i contenuti di queste due relazioni usando il JOIN operatore come mostrato di seguito.

grunt> emp = JOIN employee BY (id,jobid), employee_contact BY (id,jobid);

Verifica

Verifica la relazione emp usando il DUMP operatore come mostrato di seguito.

grunt> Dump emp;

Produzione

Produrrà il seguente output, visualizzando il contenuto della relazione denominata emp come mostrato di seguito.

(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)