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)