Apache Pig: funciones definidas por el usuario

Aparte de las funciones integradas, Apache Pig proporciona un amplio soporte para Ugris Ddefinido Fsindicatos (UDF). Usando estas UDF, podemos definir nuestras propias funciones y usarlas. La compatibilidad con 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 demás lenguajes. Con Java, puede escribir UDF que incluyan todas las partes de procesamiento como cargar / guardar datos, transformar columnas y agregar. Debido a que Apache Pig se escribió en Java, las UDF escritas con el lenguaje Java funcionan de manera más eficiente que otros lenguajes.

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

Tipos de UDF en Java

Al escribir UDF usando Java, podemos crear y usar los siguientes tres tipos de funciones:

  • Funciones de filtro – Las funciones de filtro se utilizan como condiciones en las declaraciones de filtro. Estas funciones toman Pig como entrada y devuelven un valor booleano.

  • Funciones de evaluación – Las funciones de evaluación se utilizan en declaraciones FOREACH-GENERATE. Estas funciones toman un valor de Pig como entrada y devuelven un resultado de Pig.

  • Funciones algebraicas – Las funciones algebraicas actúan sobre paquetes internos en la instrucción FOREACHGENERATE. Estas funciones se utilizan para realizar operaciones MapReduce completas en el paquete interno.

Escribir UDF con Java

Para escribir UDF usando Java, tenemos que integrar el archivo jar Pig-0.15.0.jar… En esta sección, discutiremos cómo escribir una UDF de muestra usando Eclipse. Asegúrese de tener Eclipse y Maven instalados en su sistema antes de continuar.

Siga las instrucciones a continuación para escribir una función UDF:

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

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

  • Copie el siguiente contenido en pom.xml. Este archivo contiene 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 Dependencias de Maven sección, puede encontrar los archivos jar descargados.

  • Crea un nuevo archivo de clase llamado 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 una UDF, asegúrese de heredar la clase EvalFunc y proporcionar una implementación para ejecutivo () función. Esta función contiene el código necesario para la UDF. En el ejemplo anterior, devolvimos 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. Esto le da un menú. Elegir exportar como se muestra en la siguiente captura de pantalla.

Seleccionar exportar

  • Cuando presionas exportar, obtendrá la siguiente ventana. Prensa Archivo JAR

Haga clic en Exportar

  • Continuar haciendo clic Siguiente> botón. Obtendrá otra ventana en la que deberá ingresar la ruta en el sistema de archivos local donde debe guardar el archivo jar.

latas de exportación

  • Finalmente presione el botón Fin botón. En la carpeta especificada el archivo Jar sample_udf.jar creado. Este archivo jar contiene una UDF escrita en Java.

Usando UDF

Después de escribir el UDF y generar el archivo Jar, siga estos pasos:

Paso 1: registrar el archivo Jar

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

Sintaxis

A continuación se muestra la sintaxis de la instrucción Register.

REGISTER path; 

Ejemplo

Como ejemplo, registremos el archivo sample_udf.jar que creamos anteriormente en este capítulo.

Ejecute 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'

Nota – suponga que el archivo Jar está en la ruta – /$PIG_HOME/sample_udf.jar

Paso 2: definir el alias

Después de registrar la UDF, podemos definir un alias para ella usando Definir operador.

Sintaxis

A continuación se muestra la sintaxis de la declaración Define.

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

Ejemplo

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

DEFINE sample_eval sample_eval();

Paso 3: usar UDF

Después de definir un alias, puede usar UDF como funciones integradas. Supongamos que hay un archivo llamado emp_data en 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

Supongamos 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 UDF sample_eval

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

Verificar el contenido de la relación Mayúsculas Como se muestra abajo.

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

🚫