Apache Pig - ฟังก์ชั่นที่ผู้ใช้กำหนด

นอกเหนือจากฟังก์ชั่นในตัว Apache Pig ยังให้การสนับสนุนที่กว้างขวางสำหรับ Uเซอร์ Defined Fการแยก (UDF's) เมื่อใช้ UDF เหล่านี้เราสามารถกำหนดฟังก์ชันของเราเองและใช้งานได้ การสนับสนุน UDF มีให้ในหกภาษาโปรแกรม ได้แก่ Java, Jython, Python, JavaScript, Ruby และ Groovy

สำหรับการเขียน UDF การสนับสนุนที่สมบูรณ์มีให้ใน Java และการสนับสนุนที่ จำกัด มีให้ในภาษาที่เหลือทั้งหมด ด้วยการใช้ Java คุณสามารถเขียน UDF ที่เกี่ยวข้องกับทุกส่วนของการประมวลผลเช่นการโหลดข้อมูล / การจัดเก็บการแปลงคอลัมน์และการรวม เนื่องจาก Apache Pig ถูกเขียนด้วยภาษา Java การเขียนของ UDF โดยใช้ภาษา Java จึงทำงานได้อย่างมีประสิทธิภาพเมื่อเทียบกับภาษาอื่น ๆ

ใน Apache Pig เรายังมีที่เก็บ Java สำหรับชื่อ UDF Piggybank. การใช้ Piggybank เราสามารถเข้าถึง Java UDF ที่เขียนโดยผู้ใช้รายอื่นและสนับสนุน UDF ของเราเอง

ประเภทของ UDF ใน Java

ในขณะที่เขียน UDF โดยใช้ Java เราสามารถสร้างและใช้ฟังก์ชันสามประเภทต่อไปนี้ -

  • Filter Functions- ฟังก์ชันตัวกรองใช้เป็นเงื่อนไขในคำสั่งตัวกรอง ฟังก์ชันเหล่านี้ยอมรับค่า Pig เป็นอินพุตและส่งคืนค่าบูลีน

  • Eval Functions- ฟังก์ชัน Eval ใช้ในคำสั่ง FOREACH-GENERATE ฟังก์ชันเหล่านี้ยอมรับค่า Pig เป็นอินพุตและส่งคืนผลลัพธ์ Pig

  • Algebraic Functions- ฟังก์ชันพีชคณิตทำหน้าที่กับกระเป๋าชั้นในในคำสั่ง FOREACHGENERATE ฟังก์ชันเหล่านี้ใช้เพื่อดำเนินการ MapReduce เต็มรูปแบบบนกระเป๋าด้านใน

การเขียน UDF โดยใช้ Java

ในการเขียน UDF โดยใช้ Java เราต้องรวมไฟล์ jar Pig-0.15.0.jar. ในส่วนนี้เราจะพูดถึงวิธีการเขียน UDF ตัวอย่างโดยใช้ Eclipse ก่อนดำเนินการเพิ่มเติมตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Eclipse และ Maven ในระบบของคุณแล้ว

ทำตามขั้นตอนด้านล่างเพื่อเขียนฟังก์ชัน UDF -

  • เปิด Eclipse และสร้างโครงการใหม่ (พูด myproject).

  • แปลงโครงการที่สร้างขึ้นใหม่เป็นโครงการ Maven

  • คัดลอกเนื้อหาต่อไปนี้ใน pom.xml ไฟล์นี้มีการอ้างอิง Maven สำหรับไฟล์ jar Apache Pig และ 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>
  • บันทึกไฟล์และรีเฟรช ในMaven Dependencies คุณสามารถค้นหาไฟล์ jar ที่ดาวน์โหลดมาได้

  • สร้างไฟล์คลาสใหม่ด้วยชื่อ Sample_Eval และคัดลอกเนื้อหาต่อไปนี้ในนั้น

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

ในขณะที่เขียน UDF จำเป็นต้องสืบทอดคลาส EvalFunc และจัดเตรียมการนำไปใช้งาน exec()ฟังก์ชัน ภายในฟังก์ชันนี้รหัสที่จำเป็นสำหรับ UDF จะถูกเขียนขึ้น ในตัวอย่างข้างต้นเราได้ส่งคืนโค้ดเพื่อแปลงเนื้อหาของคอลัมน์ที่กำหนดให้เป็นตัวพิมพ์ใหญ่

  • หลังจากรวบรวมคลาสโดยไม่มีข้อผิดพลาดให้คลิกขวาที่ไฟล์ Sample_Eval.java จะให้เมนู เลือกexport ดังที่แสดงในภาพหน้าจอต่อไปนี้

  • เมื่อคลิก exportคุณจะได้รับหน้าต่างต่อไปนี้ คลิกที่JAR file.

  • ดำเนินการต่อไปโดยคลิก Next>ปุ่ม. คุณจะได้หน้าต่างอื่นที่คุณต้องเข้าสู่เส้นทางในระบบไฟล์ภายในซึ่งคุณต้องเก็บไฟล์ jar

  • สุดท้ายคลิกไฟล์ Finishปุ่ม. ในโฟลเดอร์ที่ระบุไฟล์ Jarsample_udf.jarถูกสร้างขึ้น ไฟล์ jar นี้มี UDF ที่เขียนด้วย Java

การใช้ UDF

หลังจากเขียน UDF และสร้างไฟล์ Jar แล้วให้ทำตามขั้นตอนด้านล่าง -

ขั้นตอนที่ 1: การลงทะเบียนไฟล์ Jar

หลังจากเขียน UDF (ใน Java) เราต้องลงทะเบียนไฟล์ Jar ที่มี UDF โดยใช้ตัวดำเนินการ Register โดยการลงทะเบียนไฟล์ Jar ผู้ใช้สามารถกำหนดตำแหน่งของ UDF กับ Apache Pig ได้อย่างใกล้ชิด

Syntax

ด้านล่างเป็นไวยากรณ์ของตัวดำเนินการ Register

REGISTER path;

Example

ดังตัวอย่างให้เราลงทะเบียน sample_udf.jar ที่สร้างขึ้นก่อนหน้านี้ในบทนี้

เริ่มต้น Apache Pig ในโหมดโลคัลและลงทะเบียนไฟล์ jar sample_udf.jar ดังที่แสดงด้านล่าง

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

REGISTER '/$PIG_HOME/sample_udf.jar'

Note - สมมติไฟล์ Jar ในเส้นทาง - /$PIG_HOME/sample_udf.jar

ขั้นตอนที่ 2: การกำหนดนามแฝง

หลังจากลงทะเบียน UDF แล้วเราสามารถกำหนดนามแฝงได้โดยใช้ Define ตัวดำเนินการ

Syntax

ด้านล่างเป็นไวยากรณ์ของตัวดำเนินการกำหนด

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

Example

กำหนดนามแฝงสำหรับ sample_eval ดังที่แสดงด้านล่าง

DEFINE sample_eval sample_eval();

ขั้นตอนที่ 3: การใช้ UDF

หลังจากกำหนดนามแฝงแล้วคุณสามารถใช้ UDF เหมือนกับฟังก์ชันในตัว สมมติว่ามีไฟล์ชื่อ emp_data ใน HDFS/Pig_Data/ ไดเรกทอรีที่มีเนื้อหาต่อไปนี้

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

และสมมติว่าเราได้โหลดไฟล์นี้ลงใน Pig ตามที่แสดงด้านล่าง

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

ตอนนี้ให้เราแปลงชื่อของพนักงานเป็นตัวพิมพ์ใหญ่โดยใช้ UDF sample_eval.

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

ตรวจสอบเนื้อหาของความสัมพันธ์ Upper_case ดังแสดงด้านล่าง

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