Apache Pig - Operador de unión

los JOINEl operador se utiliza para combinar registros de dos o más relaciones. Al realizar una operación de unión, declaramos una (o un grupo de) tuplas de cada relación, como claves. Cuando estas claves coinciden, las dos tuplas particulares coinciden, de lo contrario, los registros se eliminan. Las uniones pueden ser de los siguientes tipos:

  • Self-join
  • Inner-join
  • Combinación externa: combinación izquierda, combinación derecha y combinación completa

Este capítulo explica con ejemplos cómo utilizar el operador de combinación en Pig Latin. Supongamos que tenemos dos archivos a sabercustomers.txt y orders.txt en el /pig_data/ directorio de HDFS como se muestra a continuación.

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

Y hemos cargado estos dos archivos en Pig con las relaciones customers y orders Como se muestra abajo.

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

Realicemos ahora varias operaciones de unión en estas dos relaciones.

Auto - unirse

Self-join se utiliza para unir una tabla consigo misma como si fueran dos relaciones, cambiando temporalmente el nombre de al menos una relación.

Generalmente, en Apache Pig, para realizar la autounión, cargaremos los mismos datos varias veces, bajo diferentes alias (nombres). Por tanto, carguemos el contenido del archivo.customers.txt como dos tablas como se muestra a continuación.

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

Sintaxis

A continuación se muestra la sintaxis de realizar self-join operación usando el JOIN operador.

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

Ejemplo

Vamos a realizar self-join operación en la relación customers, uniendo las dos relaciones customers1 y customers2 Como se muestra abajo.

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

Verificación

Verifica la relación customers3 utilizando la DUMP operador como se muestra a continuación.

grunt> Dump customers3;

Salida

Producirá la siguiente salida, mostrando el contenido de la relación 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)

Unir internamente

Inner Joinse usa con bastante frecuencia; también se conoce comoequijoin. Una combinación interna devuelve filas cuando hay una coincidencia en ambas tablas.

Crea una nueva relación combinando valores de columna de dos relaciones (digamos A y B) basadas en el predicado de unión. La consulta compara cada fila de A con cada fila de B para encontrar todos los pares de filas que satisfacen el predicado de unión. Cuando se satisface el predicado de unión, los valores de columna para cada par de filas coincidentes de A y B se combinan en una fila de resultados.

Sintaxis

Aquí está la sintaxis de realizar inner join operación usando el JOIN operador.

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

Ejemplo

Vamos a realizar inner join operación en las dos relaciones customers y orders Como se muestra abajo.

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

Verificación

Verifica la relación coustomer_orders utilizando la DUMP operador como se muestra a continuación.

grunt> Dump coustomer_orders;

Salida

Obtendrá el siguiente resultado que mostrará el contenido de la relación denominada 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 -

Unión externa : a diferencia de la combinación interna,outer joindevuelve todas las filas de al menos una de las relaciones. Una operación de unión externa se lleva a cabo de tres formas:

  • Izquierda combinación externa
  • Unión exterior derecha
  • Unión externa completa

Izquierda combinación externa

los left outer Join La operación devuelve todas las filas de la tabla de la izquierda, incluso si no hay coincidencias en la relación de la derecha.

Sintaxis

A continuación se muestra la sintaxis de realizar left outer join operación usando el JOIN operador.

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

Ejemplo

Realicemos la operación de unión externa izquierda en los dos clientes de relaciones y pedidos como se muestra a continuación.

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

Verificación

Verifica la relación outer_left utilizando la DUMP operador como se muestra a continuación.

grunt> Dump outer_left;

Salida

Producirá la siguiente salida, mostrando el contenido de la relación 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,,,,)

Unión externa derecha

los right outer join La operación devuelve todas las filas de la tabla de la derecha, incluso si no hay coincidencias en la tabla de la izquierda.

Sintaxis

A continuación se muestra la sintaxis de realizar right outer join operación usando el JOIN operador.

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

Ejemplo

Vamos a realizar right outer join operación en las dos relaciones customers y orders Como se muestra abajo.

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

Verificación

Verifica la relación outer_right utilizando la DUMP operador como se muestra a continuación.

grunt> Dump outer_right

Salida

Producirá la siguiente salida, mostrando el contenido de la relación 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)

Unión externa completa

los full outer join La operación devuelve filas cuando hay una coincidencia en una de las relaciones.

Sintaxis

A continuación se muestra la sintaxis de realizar full outer join utilizando la JOIN operador.

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

Ejemplo

Vamos a realizar full outer join operación en las dos relaciones customers y orders Como se muestra abajo.

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

Verificación

Verifica la relación outer_full utilizando la DUMP operador como se muestra a continuación.

grun> Dump outer_full;

Salida

Producirá la siguiente salida, mostrando el contenido de la relación 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,,,,)

Usando múltiples claves

Podemos realizar la operación JOIN usando múltiples claves.

Sintaxis

Así es como puede realizar una operación JOIN en dos tablas usando varias claves.

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

Supongamos que tenemos dos archivos a saber employee.txt y employee_contact.txt en el /pig_data/ directorio de HDFS como se muestra a continuación.

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

Y hemos cargado estos dos archivos en Pig con relaciones employee y employee_contact Como se muestra abajo.

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

Ahora, unamos los contenidos de estas dos relaciones usando el JOIN operador como se muestra a continuación.

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

Verificación

Verifica la relación emp utilizando la DUMP operador como se muestra a continuación.

grunt> Dump emp;

Salida

Producirá la siguiente salida, mostrando el contenido de la relación denominada emp Como se muestra abajo.

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