Apache Pig - Fungsi Buatan Pengguna

Selain fungsi bawaan, Apache Pig menyediakan dukungan ekstensif untuk User Defined Functions (UDF's). Dengan menggunakan UDF ini, kita dapat mendefinisikan fungsi kita sendiri dan menggunakannya. Dukungan UDF tersedia dalam enam bahasa pemrograman, yaitu Java, Jython, Python, JavaScript, Ruby dan Groovy.

Untuk menulis UDF, dukungan lengkap disediakan di Java dan dukungan terbatas disediakan di semua bahasa yang tersisa. Menggunakan Java, Anda dapat menulis UDF yang melibatkan semua bagian pemrosesan seperti pemuatan / penyimpanan data, transformasi kolom, dan agregasi. Sejak Apache Pig ditulis di Java, UDF yang ditulis menggunakan bahasa Java bekerja secara efisien dibandingkan dengan bahasa lain.

Di Apache Pig, kami juga memiliki repositori Java untuk UDF bernama Piggybank. Dengan menggunakan Piggybank, kita dapat mengakses UDF Java yang ditulis oleh pengguna lain, dan memberikan UDF milik kita sendiri.

Jenis UDF di Jawa

Saat menulis UDF menggunakan Java, kita dapat membuat dan menggunakan tiga jenis fungsi berikut -

  • Filter Functions- Fungsi filter digunakan sebagai kondisi dalam pernyataan filter. Fungsi ini menerima nilai Pig sebagai masukan dan mengembalikan nilai Boolean.

  • Eval Functions- Fungsi Eval digunakan dalam pernyataan FOREACH-GENERATE. Fungsi-fungsi ini menerima nilai Pig sebagai masukan dan mengembalikan hasil Pig.

  • Algebraic Functions- Fungsi Aljabar bekerja pada kantong dalam dalam pernyataan FOREACHGENERATE. Fungsi ini digunakan untuk melakukan operasi MapReduce penuh pada tas bagian dalam.

Menulis UDF menggunakan Java

Untuk menulis UDF menggunakan Java, kita harus mengintegrasikan file jar Pig-0.15.0.jar. Di bagian ini, kami membahas cara menulis UDF sampel menggunakan Eclipse. Sebelum melanjutkan lebih jauh, pastikan Anda telah menginstal Eclipse dan Maven di sistem Anda.

Ikuti langkah-langkah yang diberikan di bawah ini untuk menulis fungsi UDF -

  • Buka Eclipse dan buat proyek baru (misalnya myproject).

  • Ubah proyek yang baru dibuat menjadi proyek Maven.

  • Salin konten berikut di pom.xml. File ini berisi dependensi Maven untuk file jar Apache Pig dan 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>
  • Simpan file dan segarkan. DalamMaven Dependencies bagian, Anda dapat menemukan file jar yang diunduh.

  • Buat file kelas baru dengan nama Sample_Eval dan salin konten berikut di dalamnya.

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();  
   } 
}

Saat menulis UDF, itu wajib untuk mewarisi kelas EvalFunc dan menyediakan implementasi ke exec()fungsi. Dalam fungsi ini, kode yang diperlukan untuk UDF ditulis. Dalam contoh di atas, kami telah mengembalikan kode untuk mengubah konten kolom yang diberikan menjadi huruf besar.

  • Setelah menyusun kelas tanpa kesalahan, klik kanan pada file Sample_Eval.java. Ini memberi Anda menu. Pilihexport seperti yang ditunjukkan pada tangkapan layar berikut.

  • Saat mengklik export, Anda akan mendapatkan jendela berikut. KlikJAR file.

  • Lanjutkan lebih jauh dengan mengklik Next>tombol. Anda akan mendapatkan jendela lain di mana Anda harus memasukkan jalur di sistem file lokal, tempat Anda perlu menyimpan file jar.

  • Terakhir, klik Finishtombol. Di folder yang ditentukan, file Jarsample_udf.jardibuat. File jar ini berisi UDF yang ditulis dalam Java.

Menggunakan UDF

Setelah menulis UDF dan menghasilkan file Jar, ikuti langkah-langkah yang diberikan di bawah ini -

Langkah 1: Mendaftarkan file Jar

Setelah menulis UDF (di Java) kita harus mendaftarkan file Jar yang berisi UDF menggunakan operator Register. Dengan mendaftarkan file Jar, pengguna dapat mengetahui lokasi UDF ke Apache Pig.

Syntax

Diberikan di bawah ini adalah sintaks dari operator Register.

REGISTER path;

Example

Sebagai contoh mari kita daftarkan sample_udf.jar yang dibuat sebelumnya di bab ini.

Mulai Apache Pig dalam mode lokal dan daftarkan file jar sample_udf.jar seperti yang ditunjukkan di bawah ini.

$cd PIG_HOME/bin 
$./pig –x local 

REGISTER '/$PIG_HOME/sample_udf.jar'

Note - asumsikan file Jar di jalur - /$PIG_HOME/sample_udf.jar

Langkah 2: Mendefinisikan Alias

Setelah mendaftarkan UDF kita dapat menentukan alias untuk itu menggunakan Define operator.

Syntax

Diberikan di bawah ini adalah sintaks dari operator Define.

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

Example

Tentukan alias untuk sample_eval seperti yang ditunjukkan di bawah ini.

DEFINE sample_eval sample_eval();

Langkah 3: Menggunakan UDF

Setelah menentukan alias Anda dapat menggunakan UDF yang sama dengan fungsi bawaan. Misalkan ada file bernama emp_data di HDFS/Pig_Data/ direktori dengan konten berikut.

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

Dan asumsikan kita telah memuat file ini ke Pig seperti yang ditunjukkan di bawah ini.

grunt> emp_data = LOAD 'hdfs://localhost:9000/pig_data/emp1.txt' USING PigStorage(',')
   as (id:int, name:chararray, age:int, city:chararray);

Sekarang mari kita ubah nama karyawan menjadi huruf besar menggunakan UDF sample_eval.

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

Verifikasi konten relasi Upper_case seperti gambar dibawah.

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