Apache Pig - Funzioni definite dall'utente
Oltre alle funzioni integrate, Apache Pig fornisce un ampio supporto per User Ddefinito Funzioni (UDF). Usando queste UDF, possiamo definire le nostre funzioni e usarle. Il supporto UDF è fornito in sei linguaggi di programmazione, ovvero Java, Jython, Python, JavaScript, Ruby e Groovy.
Per la scrittura di UDF, viene fornito un supporto completo in Java e un supporto limitato in tutte le lingue rimanenti. Utilizzando Java, è possibile scrivere UDF che coinvolgono tutte le parti dell'elaborazione come caricamento / archiviazione dei dati, trasformazione delle colonne e aggregazione. Poiché Apache Pig è stato scritto in Java, le UDF scritte utilizzando il linguaggio Java funzionano in modo efficiente rispetto ad altri linguaggi.
In Apache Pig, abbiamo anche un repository Java per UDF denominato Piggybank. Utilizzando Piggybank, possiamo accedere alle UDF Java scritte da altri utenti e contribuire con le nostre UDF.
Tipi di UDF in Java
Durante la scrittura di UDF utilizzando Java, possiamo creare e utilizzare i seguenti tre tipi di funzioni:
Filter Functions- Le funzioni di filtro vengono utilizzate come condizioni nelle istruzioni di filtro. Queste funzioni accettano un valore Pig come input e restituiscono un valore booleano.
Eval Functions- Le funzioni Eval vengono utilizzate nelle istruzioni FOREACH-GENERATE. Queste funzioni accettano un valore Pig come input e restituiscono un risultato Pig.
Algebraic Functions- Le funzioni algebriche agiscono sulle borse interne in una dichiarazione FOREACHGENERATE. Queste funzioni vengono utilizzate per eseguire operazioni MapReduce complete su una borsa interna.
Scrivere UDF usando Java
Per scrivere una UDF utilizzando Java, dobbiamo integrare il file jar Pig-0.15.0.jar. In questa sezione, discuteremo come scrivere un esempio di UDF utilizzando Eclipse. Prima di procedere oltre, assicurati di aver installato Eclipse e Maven nel tuo sistema.
Seguire i passaggi indicati di seguito per scrivere una funzione UDF:
Apri Eclipse e crea un nuovo progetto (ad esempio myproject).
Converti il progetto appena creato in un progetto Maven.
Copia il seguente contenuto nel pom.xml. Questo file contiene le dipendenze Maven per i file jar di Apache Pig e 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>
Salva il file e aggiornalo. NelMaven Dependencies sezione, puoi trovare i file jar scaricati.
Crea un nuovo file di classe con il nome Sample_Eval e copia il seguente contenuto in esso.
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();
}
}
Durante la scrittura di UDF, è obbligatorio ereditare la classe EvalFunc e fornire l'implementazione a exec()funzione. All'interno di questa funzione viene scritto il codice richiesto per l'UDF. Nell'esempio sopra, abbiamo restituito il codice per convertire il contenuto della colonna data in maiuscolo.
Dopo aver compilato la classe senza errori, fare clic con il pulsante destro del mouse sul file Sample_Eval.java. Ti dà un menu. Selezionareexport come mostrato nello screenshot seguente.
Facendo clic export, otterrai la seguente finestra. Clicca suJAR file.
Procedi ulteriormente cliccando Next>pulsante. Verrà visualizzata un'altra finestra in cui è necessario immettere il percorso nel file system locale, in cui è necessario memorizzare il file jar.
Infine fare clic su Finishpulsante. Nella cartella specificata, un file Jarsample_udf.jarè creato. Questo file jar contiene l'UDF scritto in Java.
Utilizzando l'UDF
Dopo aver scritto l'UDF e generato il file Jar, segui i passaggi indicati di seguito:
Passaggio 1: registrazione del file Jar
Dopo aver scritto UDF (in Java) dobbiamo registrare il file Jar che contiene l'UDF utilizzando l'operatore Register. Registrando il file Jar, gli utenti possono indicare la posizione dell'UDF ad Apache Pig.
Syntax
Di seguito è riportata la sintassi dell'operatore Register.
REGISTER path;
Example
Come esempio registriamo il file sample_udf.jar creato in precedenza in questo capitolo.
Avvia Apache Pig in modalità locale e registra il file jar sample_udf.jar come mostrato di seguito.
$cd PIG_HOME/bin
$./pig –x local
REGISTER '/$PIG_HOME/sample_udf.jar'
Note - assume il file Jar nel percorso - /$PIG_HOME/sample_udf.jar
Passaggio 2: definizione dell'alias
Dopo aver registrato l'UDF, possiamo definirne un alias usando il Define operatore.
Syntax
Di seguito è riportata la sintassi dell'operatore Define.
DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };
Example
Definisci l'alias per sample_eval come mostrato di seguito.
DEFINE sample_eval sample_eval();
Passaggio 3: utilizzo dell'UDF
Dopo aver definito l'alias è possibile utilizzare l'UDF come le funzioni integrate. Supponiamo che ci sia un file denominato emp_data nell'HDFS/Pig_Data/ directory con il seguente contenuto.
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
E supponiamo di aver caricato questo file in Pig come mostrato di seguito.
grunt> emp_data = LOAD 'hdfs://localhost:9000/pig_data/emp1.txt' USING PigStorage(',')
as (id:int, name:chararray, age:int, city:chararray);
Convertiamo ora i nomi dei dipendenti in lettere maiuscole usando l'UDF sample_eval.
grunt> Upper_case = FOREACH emp_data GENERATE sample_eval(name);
Verifica il contenuto della relazione Upper_case come mostrato di seguito.
grunt> Dump Upper_case;
(ROBIN)
(BOB)
(MAYA)
(SARA)
(DAVID)
(MAGGY)
(ROBERT)
(SYAM)
(MARY)
(SARAN)
(STACY)
(KELLY)