Apache Pig: funciones definidas por el usuario

Además de las funciones integradas, Apache Pig proporciona un amplio soporte para User Dafinado Funciones (UDF). Usando estas UDF, podemos definir nuestras propias funciones y usarlas. El soporte UDF se proporciona en seis lenguajes de programación, a saber, Java, Jython, Python, JavaScript, Ruby y Groovy.

Para escribir UDF, se proporciona soporte completo en Java y soporte limitado en todos los idiomas restantes. Con Java, puede escribir UDF que involucren todas las partes del procesamiento, como la carga / almacenamiento de datos, la transformación de columnas y la agregación. Dado que Apache Pig se ha escrito en Java, las UDF escritas con lenguaje Java funcionan de manera eficiente en comparación con otros lenguajes.

En Apache Pig, también tenemos un repositorio de Java para UDF llamado Piggybank. Usando Piggybank, podemos acceder a las UDF de Java escritas por otros usuarios y contribuir con nuestras propias UDF.

Tipos de UDF en Java

Mientras escribimos UDF usando Java, podemos crear y usar los siguientes tres tipos de funciones:

  • Filter Functions- Las funciones de filtro se utilizan como condiciones en declaraciones de filtro. Estas funciones aceptan un valor Pig como entrada y devuelven un valor booleano.

  • Eval Functions- Las funciones Eval se utilizan en declaraciones FOREACH-GENERATE. Estas funciones aceptan un valor de Pig como entrada y devuelven un resultado de Pig.

  • Algebraic Functions- Las funciones algebraicas actúan sobre bolsas internas en una instrucción FOREACHGENERATE. Estas funciones se utilizan para realizar operaciones MapReduce completas en una bolsa interior.

Escribir UDF usando Java

Para escribir una UDF usando Java, tenemos que integrar el archivo jar Pig-0.15.0.jar. En esta sección, discutimos cómo escribir una UDF de muestra usando Eclipse. Antes de continuar, asegúrese de haber instalado Eclipse y Maven en su sistema.

Siga los pasos que se indican a continuación para escribir una función UDF:

  • Abra Eclipse y cree un nuevo proyecto (digamos myproject).

  • Convierta el proyecto recién creado en un proyecto Maven.

  • Copie el siguiente contenido en pom.xml. Este archivo contiene las dependencias de Maven para los archivos jar de Apache Pig y 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>
  • Guarde el archivo y actualícelo. En elMaven Dependencies sección, puede encontrar los archivos jar descargados.

  • Crea un nuevo archivo de clase con nombre Sample_Eval y copie el siguiente contenido en él.

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

Al escribir UDF, es obligatorio heredar la clase EvalFunc y proporcionar implementación a exec()función. Dentro de esta función, se escribe el código requerido para la UDF. En el ejemplo anterior, hemos devuelto el código para convertir el contenido de la columna dada a mayúsculas.

  • Después de compilar la clase sin errores, haga clic con el botón derecho en el archivo Sample_Eval.java. Te da un menú. Seleccioneexport como se muestra en la siguiente captura de pantalla.

  • Al hacer clic export, obtendrá la siguiente ventana. Haga clic enJAR file.

  • Continúe haciendo clic en Next>botón. Obtendrá otra ventana en la que debe ingresar la ruta en el sistema de archivos local, donde debe almacenar el archivo jar.

  • Finalmente haga clic en el Finishbotón. En la carpeta especificada, un archivo Jarsample_udf.jares creado. Este archivo jar contiene la UDF escrita en Java.

Usando la UDF

Después de escribir el UDF y generar el archivo Jar, siga los pasos que se indican a continuación:

Paso 1: registrar el archivo Jar

Después de escribir UDF (en Java) tenemos que registrar el archivo Jar que contiene la UDF usando el operador Register. Al registrar el archivo Jar, los usuarios pueden indicar la ubicación de la UDF en Apache Pig.

Syntax

A continuación se muestra la sintaxis del operador de registro.

REGISTER path;

Example

Como ejemplo, registremos el sample_udf.jar creado anteriormente en este capítulo.

Inicie Apache Pig en modo local y registre el archivo jar sample_udf.jar como se muestra a continuación.

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

REGISTER '/$PIG_HOME/sample_udf.jar'

Note - asume el archivo Jar en la ruta - /$PIG_HOME/sample_udf.jar

Paso 2: Definición de alias

Después de registrar la UDF podemos definirle un alias usando el Define operador.

Syntax

A continuación se muestra la sintaxis del operador Definir.

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

Example

Defina el alias para sample_eval como se muestra a continuación.

DEFINE sample_eval sample_eval();

Paso 3: usar la UDF

Después de definir el alias, puede usar la UDF igual que las funciones integradas. Suponga que hay un archivo llamado emp_data en el HDFS/Pig_Data/ directorio con el siguiente contenido.

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

Y suponga que hemos cargado este archivo en Pig como se muestra a continuación.

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

Ahora convierta los nombres de los empleados a mayúsculas usando la UDF sample_eval.

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

Verificar el contenido de la relación Upper_case Como se muestra abajo.

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