Apache Pig - funkcje zdefiniowane przez użytkownika
Oprócz wbudowanych funkcji, Apache Pig zapewnia szerokie wsparcie dla User Defined Functions (UDF). Korzystając z tych UDF, możemy definiować własne funkcje i używać ich. Obsługa UDF jest dostępna w sześciu językach programowania, a mianowicie w Java, Jython, Python, JavaScript, Ruby i Groovy.
W przypadku pisania UDF zapewniane jest pełne wsparcie w języku Java i ograniczone wsparcie we wszystkich pozostałych językach. Korzystając z języka Java, możesz pisać UDF obejmujące wszystkie części przetwarzania, takie jak ładowanie / przechowywanie danych, transformacja kolumn i agregacja. Odkąd Apache Pig został napisany w Javie, UDF napisany w języku Java działa wydajnie w porównaniu z innymi językami.
W Apache Pig mamy również repozytorium Java dla UDF o nazwie Piggybank. Korzystając z Piggybank, możemy uzyskać dostęp do Java UDF napisanych przez innych użytkowników i wnieść własne UDF.
Rodzaje UDF w Javie
Pisząc UDF w Javie, możemy tworzyć i używać następujących trzech typów funkcji -
Filter Functions- Funkcje filtrujące są używane jako warunki w instrukcjach filtrujących. Te funkcje akceptują wartość Pig jako dane wejściowe i zwracają wartość logiczną.
Eval Functions- Funkcje Eval są używane w instrukcjach FOREACH-GENERATE. Te funkcje akceptują wartość Pig jako dane wejściowe i zwracają wynik Pig.
Algebraic Functions- Funkcje algebraiczne działają na worki wewnętrzne w instrukcji FOREACHGENERATE. Te funkcje są używane do wykonywania pełnych operacji MapReduce na wewnętrznej torbie.
Pisanie UDF w Javie
Aby napisać UDF przy użyciu Javy, musimy zintegrować plik jar Pig-0.15.0.jar. W tej sekcji omówimy, jak napisać przykładowy plik UDF za pomocą Eclipse. Zanim przejdziesz dalej, upewnij się, że zainstalowałeś Eclipse i Maven w swoim systemie.
Wykonaj czynności podane poniżej, aby napisać funkcję UDF -
Otwórz Eclipse i utwórz nowy projekt (powiedzmy myproject).
Przekonwertuj nowo utworzony projekt na projekt Maven.
Skopiuj następującą zawartość do pom.xml. Ten plik zawiera zależności Maven dla plików jar Apache Pig i 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>
Zapisz plik i odśwież go. wMaven Dependencies w sekcji możesz znaleźć pobrane pliki jar.
Utwórz nowy plik klasy o nazwie Sample_Eval i skopiuj w nim następującą zawartość.
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();
}
}
Podczas pisania UDF konieczne jest dziedziczenie klasy EvalFunc i zapewnienie implementacji do exec()funkcjonować. W ramach tej funkcji zapisywany jest kod wymagany dla UDF. W powyższym przykładzie zwróciliśmy kod konwertujący zawartość danej kolumny na wielkie litery.
Po skompilowaniu klasy bez błędów kliknij prawym przyciskiem myszy plik Sample_Eval.java. To daje ci menu. Wybierzexport jak pokazano na poniższym zrzucie ekranu.
Po kliknięciu export, pojawi się następujące okno. KliknijJAR file.
Przejdź dalej, klikając Next>przycisk. Otrzymasz kolejne okno, w którym musisz wprowadzić ścieżkę w lokalnym systemie plików, w którym musisz zapisać plik jar.
Na koniec kliknij Finishprzycisk. W określonym folderze plik Jarsample_udf.jarjest tworzone. Ten plik jar zawiera UDF napisany w Javie.
Korzystanie z UDF
Po zapisaniu UDF i wygenerowaniu pliku Jar, wykonaj kroki podane poniżej -
Krok 1: Rejestracja pliku Jar
Po zapisaniu UDF (w Javie) musimy zarejestrować plik Jar, który zawiera UDF za pomocą operatora Register. Rejestrując plik Jar, użytkownicy mogą określić lokalizację UDF w Apache Pig.
Syntax
Poniżej podano składnię operatora rejestru.
REGISTER path;
Example
Jako przykład zarejestrujmy plik sample_udf.jar utworzony wcześniej w tym rozdziale.
Uruchom Apache Pig w trybie lokalnym i zarejestruj plik jar sample_udf.jar, jak pokazano poniżej.
$cd PIG_HOME/bin
$./pig –x local
REGISTER '/$PIG_HOME/sample_udf.jar'
Note - załóż plik Jar w ścieżce - /$PIG_HOME/sample_udf.jar
Krok 2: Definiowanie aliasu
Po zarejestrowaniu UDF możemy zdefiniować do niego alias za pomocą rozszerzenia Define operator.
Syntax
Poniżej podano składnię operatora Define.
DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };
Example
Zdefiniuj alias dla sample_eval, jak pokazano poniżej.
DEFINE sample_eval sample_eval();
Krok 3: Korzystanie z UDF
Po zdefiniowaniu aliasu możesz użyć UDF tak samo, jak funkcji wbudowanych. Załóżmy, że w HDFS znajduje się plik o nazwie emp_data/Pig_Data/ katalog z następującą zawartością.
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
I załóżmy, że załadowaliśmy ten plik do Pig, jak pokazano poniżej.
grunt> emp_data = LOAD 'hdfs://localhost:9000/pig_data/emp1.txt' USING PigStorage(',')
as (id:int, name:chararray, age:int, city:chararray);
Zamieńmy teraz nazwiska pracowników na wielkie litery, używając UDF sample_eval.
grunt> Upper_case = FOREACH emp_data GENERATE sample_eval(name);
Sprawdź zawartość relacji Upper_case jak pokazano niżej.
grunt> Dump Upper_case;
(ROBIN)
(BOB)
(MAYA)
(SARA)
(DAVID)
(MAGGY)
(ROBERT)
(SYAM)
(MARY)
(SARAN)
(STACY)
(KELLY)