Apache Pig - Fonctions définies par l'utilisateur

En plus des fonctions intégrées, Apache Pig fournit un support étendu pour User Ddéfini Ffonctions (UDF). En utilisant ces UDF, nous pouvons définir nos propres fonctions et les utiliser. Le support UDF est fourni dans six langages de programmation, à savoir, Java, Jython, Python, JavaScript, Ruby et Groovy.

Pour l'écriture d'UDF, un support complet est fourni en Java et un support limité est fourni dans toutes les langues restantes. En utilisant Java, vous pouvez écrire des UDF impliquant toutes les parties du traitement telles que le chargement / stockage de données, la transformation de colonne et l'agrégation. Depuis qu'Apache Pig a été écrit en Java, les UDF écrits en langage Java fonctionnent efficacement par rapport aux autres langages.

Dans Apache Pig, nous avons également un référentiel Java pour UDF nommé Piggybank. En utilisant Piggybank, nous pouvons accéder aux UDF Java écrits par d'autres utilisateurs et contribuer à nos propres UDF.

Types d'UDF en Java

Lors de l'écriture d'UDF en Java, nous pouvons créer et utiliser les trois types de fonctions suivants -

  • Filter Functions- Les fonctions de filtrage sont utilisées comme conditions dans les instructions de filtrage. Ces fonctions acceptent une valeur Pig comme entrée et renvoient une valeur booléenne.

  • Eval Functions- Les fonctions Eval sont utilisées dans les instructions FOREACH-GENERATE. Ces fonctions acceptent une valeur Pig comme entrée et renvoient un résultat Pig.

  • Algebraic Functions- Les fonctions algébriques agissent sur les sacs intérieurs dans une instruction FOREACHGENERATE. Ces fonctions sont utilisées pour effectuer des opérations MapReduce complètes sur un sac interne.

Ecrire des UDF en Java

Pour écrire un UDF en Java, il faut intégrer le fichier jar Pig-0.15.0.jar. Dans cette section, nous expliquons comment écrire un exemple d'UDF à l'aide d'Eclipse. Avant de continuer, assurez-vous d'avoir installé Eclipse et Maven sur votre système.

Suivez les étapes ci-dessous pour écrire une fonction UDF -

  • Ouvrez Eclipse et créez un nouveau projet (disons myproject).

  • Convertissez le projet nouvellement créé en projet Maven.

  • Copiez le contenu suivant dans le pom.xml. Ce fichier contient les dépendances Maven pour les fichiers jar Apache Pig et Hadoop-core.

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0http://maven.apache .org/xsd/maven-4.0.0.xsd"> 
	
   <modelVersion>4.0.0</modelVersion> 
   <groupId>Pig_Udf</groupId> 
   <artifactId>Pig_Udf</artifactId> 
   <version>0.0.1-SNAPSHOT</version>
	
   <build>    
      <sourceDirectory>src</sourceDirectory>    
      <plugins>      
         <plugin>        
            <artifactId>maven-compiler-plugin</artifactId>        
            <version>3.3</version>        
            <configuration>          
               <source>1.7</source>          
               <target>1.7</target>        
            </configuration>      
         </plugin>    
      </plugins>  
   </build>
	
   <dependencies> 
	
      <dependency>            
         <groupId>org.apache.pig</groupId>            
         <artifactId>pig</artifactId>            
         <version>0.15.0</version>     
      </dependency> 
		
      <dependency>        
         <groupId>org.apache.hadoop</groupId>            
         <artifactId>hadoop-core</artifactId>            
         <version>0.20.2</version>     
      </dependency> 
      
   </dependencies>  
	
</project>
  • Enregistrez le fichier et actualisez-le. dans leMaven Dependencies section, vous pouvez trouver les fichiers jar téléchargés.

  • Créer un nouveau fichier de classe avec un nom Sample_Eval et copiez-y le contenu suivant.

import java.io.IOException; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple; 
 
import java.io.IOException; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple;

public class Sample_Eval extends EvalFunc<String>{ 

   public String exec(Tuple input) throws IOException {   
      if (input == null || input.size() == 0)      
      return null;      
      String str = (String)input.get(0);      
      return str.toUpperCase();  
   } 
}

Lors de l'écriture des UDF, il est obligatoire d'hériter de la classe EvalFunc et de fournir une implémentation à exec()fonction. Dans cette fonction, le code requis pour l'UDF est écrit. Dans l'exemple ci-dessus, nous avons renvoyé le code pour convertir le contenu de la colonne donnée en majuscules.

  • Après avoir compilé la classe sans erreur, cliquez avec le bouton droit sur le fichier Sample_Eval.java. Cela vous donne un menu. Sélectionnerexport comme indiqué dans la capture d'écran suivante.

  • En cliquant export, vous obtiendrez la fenêtre suivante. Cliquer surJAR file.

  • Continuez en cliquant sur Next>bouton. Vous obtiendrez une autre fenêtre dans laquelle vous devez entrer le chemin dans le système de fichiers local, où vous devez stocker le fichier jar.

  • Cliquez enfin sur le Finishbouton. Dans le dossier spécifié, un fichier Jarsample_udf.jarest créé. Ce fichier jar contient l'UDF écrit en Java.

Utilisation de l'UDF

Après avoir écrit l'UDF et généré le fichier Jar, suivez les étapes ci-dessous -

Étape 1: enregistrement du fichier Jar

Après avoir écrit UDF (en Java), nous devons enregistrer le fichier Jar qui contient l'UDF en utilisant l'opérateur Register. En enregistrant le fichier Jar, les utilisateurs peuvent intimer l'emplacement de l'UDF à Apache Pig.

Syntax

Vous trouverez ci-dessous la syntaxe de l'opérateur Register.

REGISTER path;

Example

À titre d'exemple, enregistrons le sample_udf.jar créé plus tôt dans ce chapitre.

Démarrez Apache Pig en mode local et enregistrez le fichier jar sample_udf.jar comme indiqué ci-dessous.

$cd PIG_HOME/bin 
$./pig –x local 

REGISTER '/$PIG_HOME/sample_udf.jar'

Note - supposez le fichier Jar dans le chemin - /$PIG_HOME/sample_udf.jar

Étape 2: définition de l'alias

Après avoir enregistré l'UDF, nous pouvons lui définir un alias en utilisant le Define opérateur.

Syntax

Vous trouverez ci-dessous la syntaxe de l'opérateur Define.

DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };

Example

Définissez l'alias pour sample_eval comme indiqué ci-dessous.

DEFINE sample_eval sample_eval();

Étape 3: Utilisation de l'UDF

Après avoir défini l'alias, vous pouvez utiliser l'UDF de la même manière que les fonctions intégrées. Supposons qu'il existe un fichier nommé emp_data dans le HDFS/Pig_Data/ répertoire avec le contenu suivant.

001,Robin,22,newyork
002,BOB,23,Kolkata
003,Maya,23,Tokyo
004,Sara,25,London 
005,David,23,Bhuwaneshwar 
006,Maggy,22,Chennai
007,Robert,22,newyork
008,Syam,23,Kolkata
009,Mary,25,Tokyo
010,Saran,25,London 
011,Stacy,25,Bhuwaneshwar 
012,Kelly,22,Chennai

Et supposons que nous avons chargé ce fichier dans Pig comme indiqué ci-dessous.

grunt> emp_data = LOAD 'hdfs://localhost:9000/pig_data/emp1.txt' USING PigStorage(',')
   as (id:int, name:chararray, age:int, city:chararray);

Convertissons maintenant les noms des employés en majuscules à l'aide de l'UDF sample_eval.

grunt> Upper_case = FOREACH emp_data GENERATE sample_eval(name);

Vérifier le contenu de la relation Upper_case comme indiqué ci-dessous.

grunt> Dump Upper_case;
  
(ROBIN)
(BOB)
(MAYA)
(SARA)
(DAVID)
(MAGGY)
(ROBERT)
(SYAM)
(MARY)
(SARAN)
(STACY)
(KELLY)