Apache Pig - DIFF ()

le DIFF()La fonction Pig Latin est utilisée pour comparer deux sacs (champs) dans un tuple. Il prend deux champs d'un tuple comme entrée et les fait correspondre. S'ils correspondent, il renvoie un sac vide. S'ils ne correspondent pas, il recherche les éléments qui existent dans un champ (sac) et non trouvés dans l'autre, et renvoie ces éléments en les enveloppant dans un sac.

Syntaxe

Ci-dessous, la syntaxe du DIFF() fonction.

grunt> DIFF (expression, expression)

Exemple

Généralement le DIFF()La fonction compare deux sacs dans un tuple. Étant donné ci-dessous son exemple, nous créons ici deux relations, les regroupons et calculons la différence entre elles.

Supposons que nous ayons deux fichiers à savoir emp_sales.txt et emp_bonus.txt dans le répertoire HDFS /pig_data/comme indiqué ci-dessous. leemp_sales.txt contient les coordonnées des employés du service commercial et du emp_bonus.txt contient les détails de l'employé qui a obtenu la prime.

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

Et nous avons chargé ces fichiers dans Pig, avec les noms des relations emp_sales et emp_bonus respectivement.

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

Regrouper les enregistrements / tuples des relations emp_sales et emp_bonus avec la clé sno, en utilisant l'opérateur COGROUP comme indiqué ci-dessous.

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

Vérifier la relation cogroup_data en utilisant le DUMP opérateur comme indiqué ci-dessous.

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

Calcul de la différence entre deux relations

Calculons maintenant la différence entre les deux relations en utilisant DIFF() fonction et stockez-le dans la relation diff_data comme indiqué ci-dessous.

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

Vérification

Vérifier la relation diff_data en utilisant l'opérateur DUMP comme indiqué ci-dessous.

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

le diff_data relation aura un tuple vide si les enregistrements dans emp_bonus et emp_salesrencontre. Dans d'autres cas, il contiendra les tuples des deux relations (tuples qui diffèrent).

Par exemple, si vous considérez que les enregistrements ont sno comme 1, alors vous les retrouverez dans les deux relations ((1,Robin,22,25000,sales), (1,Robin,22,25000,sales)). Par conséquent, dans lediff_data relation, qui est le résultat de DIFF() fonction, vous obtiendrez un tuple vide pour sno 1.