Cerdo Apache - DIFF ()

los DIFF()La función de Pig Latin se usa para comparar dos bolsas (campos) en una tupla. Toma dos campos de una tupla como entrada y los empareja. Si coinciden, devuelve una bolsa vacía. Si no coinciden, busca los elementos que existen en un campo (bolsa) y no se encuentran en el otro, y devuelve estos elementos envolviéndolos dentro de una bolsa.

Sintaxis

A continuación se muestra la sintaxis de la DIFF() función.

grunt> DIFF (expression, expression)

Ejemplo

Generalmente el DIFF()La función compara dos bolsas en una tupla. A continuación se muestra su ejemplo, aquí creamos dos relaciones, las agrupamos en conjunto y calculamos la diferencia entre ellas.

Supongamos que tenemos dos archivos a saber emp_sales.txt y emp_bonus.txt en el directorio HDFS /pig_data/Como se muestra abajo. losemp_sales.txt contiene los detalles de los empleados del departamento de ventas y el emp_bonus.txt contiene los detalles de los empleados que recibieron la bonificación.

emp_sales.txt

1,Robin,22,25000,sales 
2,BOB,23,30000,sales 
3,Maya,23,25000,sales 
4,Sara,25,40000,sales 
5,David,23,45000,sales 
6,Maggy,22,35000,sales

emp_bonus.txt

1,Robin,22,25000,sales 
2,Jaya,23,20000,admin 
3,Maya,23,25000,sales 
4,Alia,25,50000,admin 
5,David,23,45000,sales 
6,Omar,30,30000,admin

Y hemos cargado estos archivos en Pig, con los nombres de las relaciones emp_sales y emp_bonus respectivamente.

grunt> emp_sales = LOAD 'hdfs://localhost:9000/pig_data/emp_sales.txt' USING PigStorage(',')
   as (sno:int, name:chararray, age:int, salary:int, dept:chararray);
	
grunt> emp_bonus = LOAD 'hdfs://localhost:9000/pig_data/emp_bonus.txt' USING PigStorage(',')
   as (sno:int, name:chararray, age:int, salary:int, dept:chararray);

Agrupar los registros / tuplas de las relaciones emp_sales y emp_bonus con la llave sno, utilizando el operador COGROUP como se muestra a continuación.

grunt> cogroup_data = COGROUP emp_sales by sno, emp_bonus by sno;

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

grunt> Dump cogroup_data;
  
(1,{(1,Robin,22,25000,sales)},{(1,Robin,22,25000,sales)}) 
(2,{(2,BOB,23,30000,sales)},{(2,Jaya,23,20000,admin)}) 
(3,{(3,Maya,23,25000,sales)},{(3,Maya,23,25000,sales)}) 
(4,{(4,Sara,25,40000,sales)},{(4,Alia,25,50000,admin)}) 
(5,{(5,David,23,45000,sales)},{(5,David,23,45000,sales)}) 
(6,{(6,Maggy,22,35000,sales)},{(6,Omar,30,30000,admin)})

Calcular la diferencia entre dos relaciones

Calculemos ahora la diferencia entre las dos relaciones usando DIFF() funcionar y almacenarlo en la relación diff_data Como se muestra abajo.

grunt> diff_data = FOREACH cogroup_data GENERATE DIFF(emp_sales,emp_bonus);

Verificación

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

grunt> Dump diff_data;
   
({}) 
({(2,BOB,23,30000,sales),(2,Jaya,23,20000,admin)}) 
({}) 
({(4,Sara,25,40000,sales),(4,Alia,25,50000,admin)}) 
({}) 
({(6,Maggy,22,35000,sales),(6,Omar,30,30000,admin)})

los diff_data relación tendrá una tupla vacía si los registros en emp_bonus y emp_salespartido. En otros casos, contendrá tuplas de ambas relaciones (tuplas que difieren).

Por ejemplo, si considera los registros que tienen sno como 1, entonces los encontrarás iguales en ambas relaciones ((1,Robin,22,25000,sales), (1,Robin,22,25000,sales)). Por tanto, en eldiff_data relación, que es el resultado de DIFF() función, obtendrá una tupla vacía para sno 1.