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)