Apache Pig - Benutzerdefinierte Funktionen
Zusätzlich zu den integrierten Funktionen bietet Apache Pig umfassende Unterstützung für User Ddefiniert FGewerkschaften (UDFs). Mit diesen UDFs können wir unsere eigenen Funktionen definieren und verwenden. Die UDF-Unterstützung wird in sechs Programmiersprachen bereitgestellt, nämlich Java, Jython, Python, JavaScript, Ruby und Groovy.
Für das Schreiben von UDFs wird in Java vollständige Unterstützung bereitgestellt, und in allen verbleibenden Sprachen wird eine eingeschränkte Unterstützung bereitgestellt. Mit Java können Sie UDFs schreiben, die alle Teile der Verarbeitung wie Laden / Speichern von Daten, Spaltentransformation und Aggregation betreffen. Da Apache Pig in Java geschrieben wurde, arbeiten die mit Java geschriebenen UDFs im Vergleich zu anderen Sprachen effizient.
In Apache Pig haben wir auch ein Java-Repository für UDFs mit dem Namen Piggybank. Mit Piggybank können wir auf Java-UDFs zugreifen, die von anderen Benutzern geschrieben wurden, und unsere eigenen UDFs einbringen.
Arten von UDFs in Java
Beim Schreiben von UDFs mit Java können wir die folgenden drei Arten von Funktionen erstellen und verwenden:
Filter Functions- Die Filterfunktionen werden als Bedingungen in Filteranweisungen verwendet. Diese Funktionen akzeptieren einen Pig-Wert als Eingabe und geben einen Booleschen Wert zurück.
Eval Functions- Die Eval-Funktionen werden in FOREACH-GENERATE-Anweisungen verwendet. Diese Funktionen akzeptieren einen Pig-Wert als Eingabe und geben ein Pig-Ergebnis zurück.
Algebraic Functions- Die algebraischen Funktionen wirken in einer FOREACHGENERATE-Anweisung auf Innentaschen. Diese Funktionen werden verwendet, um vollständige MapReduce-Vorgänge an einem inneren Beutel auszuführen.
Schreiben von UDFs mit Java
Um eine UDF mit Java zu schreiben, müssen wir die JAR-Datei integrieren Pig-0.15.0.jar. In diesem Abschnitt wird erläutert, wie Sie eine Beispiel-UDF mit Eclipse schreiben. Bevor Sie fortfahren, stellen Sie sicher, dass Sie Eclipse und Maven in Ihrem System installiert haben.
Führen Sie die folgenden Schritte aus, um eine UDF-Funktion zu schreiben.
Öffnen Sie Eclipse und erstellen Sie ein neues Projekt (z myproject).
Konvertieren Sie das neu erstellte Projekt in ein Maven-Projekt.
Kopieren Sie den folgenden Inhalt in die Datei pom.xml. Diese Datei enthält die Maven-Abhängigkeiten für Apache Pig- und Hadoop-Core-JAR-Dateien.
<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>
Speichern Sie die Datei und aktualisieren Sie sie. In demMaven Dependencies Im Abschnitt finden Sie die heruntergeladenen JAR-Dateien.
Erstellen Sie eine neue Klassendatei mit Namen Sample_Eval und kopieren Sie den folgenden Inhalt hinein.
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();
}
}
Beim Schreiben von UDFs muss die EvalFunc-Klasse geerbt und die Implementierung bereitgestellt werden exec()Funktion. Innerhalb dieser Funktion wird der für die UDF erforderliche Code geschrieben. Im obigen Beispiel haben wir den Code zurückgegeben, um den Inhalt der angegebenen Spalte in Großbuchstaben umzuwandeln.
Klicken Sie nach dem fehlerfreien Kompilieren der Klasse mit der rechten Maustaste auf die Datei Sample_Eval.java. Es gibt Ihnen ein Menü. Wählenexport wie im folgenden Screenshot gezeigt.
Beim Klicken exporterhalten Sie das folgende Fenster. Klicke aufJAR file.
Fahren Sie fort, indem Sie auf klicken Next>Taste. Sie erhalten ein weiteres Fenster, in dem Sie den Pfad im lokalen Dateisystem eingeben müssen, in dem Sie die JAR-Datei speichern müssen.
Klicken Sie abschließend auf FinishTaste. Im angegebenen Ordner eine Jar-Dateisample_udf.jargeschaffen. Diese JAR-Datei enthält die in Java geschriebene UDF.
Verwenden der UDF
Führen Sie nach dem Schreiben der UDF und dem Generieren der Jar-Datei die folgenden Schritte aus:
Schritt 1: Registrieren der Jar-Datei
Nach dem Schreiben von UDF (in Java) müssen wir die Jar-Datei, die die UDF enthält, mit dem Register-Operator registrieren. Durch Registrieren der Jar-Datei können Benutzer Apache Pig den Speicherort der UDF mitteilen.
Syntax
Nachstehend ist die Syntax des Registeroperators angegeben.
REGISTER path;
Example
Als Beispiel registrieren wir das Beispiel_udf.jar, das weiter oben in diesem Kapitel erstellt wurde.
Starten Sie Apache Pig im lokalen Modus und registrieren Sie die JAR-Datei sample_udf.jar wie unten gezeigt.
$cd PIG_HOME/bin
$./pig –x local
REGISTER '/$PIG_HOME/sample_udf.jar'
Note - Nehmen Sie die Jar-Datei im Pfad - /$PIG_HOME/sample_udf.jar an
Schritt 2: Alias definieren
Nach der Registrierung der UDF können wir mit der einen Alias definieren Define Operator.
Syntax
Im Folgenden ist die Syntax des Operators Define angegeben.
DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };
Example
Definieren Sie den Alias für sample_eval wie unten gezeigt.
DEFINE sample_eval sample_eval();
Schritt 3: Verwenden der UDF
Nach dem Definieren des Alias können Sie die UDF genauso verwenden wie die integrierten Funktionen. Angenommen, das HDFS enthält eine Datei mit dem Namen emp_data/Pig_Data/ Verzeichnis mit folgendem Inhalt.
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
Angenommen, wir haben diese Datei wie unten gezeigt in Pig geladen.
grunt> emp_data = LOAD 'hdfs://localhost:9000/pig_data/emp1.txt' USING PigStorage(',')
as (id:int, name:chararray, age:int, city:chararray);
Lassen Sie uns nun die Namen der Mitarbeiter mit der UDF in Großbuchstaben umwandeln sample_eval.
grunt> Upper_case = FOREACH emp_data GENERATE sample_eval(name);
Überprüfen Sie den Inhalt der Beziehung Upper_case Wie nachfolgend dargestellt.
grunt> Dump Upper_case;
(ROBIN)
(BOB)
(MAYA)
(SARA)
(DAVID)
(MAGGY)
(ROBERT)
(SYAM)
(MARY)
(SARAN)
(STACY)
(KELLY)