Apache Pig - Chức năng do người dùng xác định
Ngoài các chức năng tích hợp, Apache Pig cung cấp hỗ trợ rộng rãi cho User Dtinh chế Fchú thích (UDF's). Sử dụng các UDF này, chúng ta có thể xác định các chức năng của riêng mình và sử dụng chúng. Hỗ trợ UDF được cung cấp bằng sáu ngôn ngữ lập trình, đó là Java, Jython, Python, JavaScript, Ruby và Groovy.
Để viết UDF, hỗ trợ hoàn chỉnh được cung cấp bằng Java và hỗ trợ hạn chế được cung cấp cho tất cả các ngôn ngữ còn lại. Sử dụng Java, bạn có thể viết UDF liên quan đến tất cả các phần của quá trình xử lý như tải / lưu trữ dữ liệu, chuyển đổi cột và tổng hợp. Vì Apache Pig được viết bằng Java, nên UDF được viết bằng ngôn ngữ Java hoạt động hiệu quả so với các ngôn ngữ khác.
Trong Apache Pig, chúng tôi cũng có một kho lưu trữ Java cho UDF có tên Piggybank. Sử dụng Piggybank, chúng tôi có thể truy cập vào Java UDF do người dùng khác viết và đóng góp UDF của riêng chúng tôi.
Các loại UDF trong Java
Trong khi viết UDF bằng Java, chúng ta có thể tạo và sử dụng ba loại hàm sau:
Filter Functions- Các chức năng bộ lọc được sử dụng làm điều kiện trong các câu lệnh bộ lọc. Các hàm này chấp nhận giá trị Pig làm đầu vào và trả về giá trị Boolean.
Eval Functions- Các hàm Eval được sử dụng trong các câu lệnh FOREACH-GENERATE. Các hàm này chấp nhận giá trị Pig làm đầu vào và trả về kết quả Pig.
Algebraic Functions- Các hàm Đại số hoạt động trên các túi bên trong trong một câu lệnh FOREACHGENERATE. Các chức năng này được sử dụng để thực hiện các hoạt động MapReduce đầy đủ trên một túi bên trong.
Viết UDF bằng Java
Để viết một UDF bằng Java, chúng ta phải tích hợp tệp jar Pig-0.15.0.jar. Trong phần này, chúng ta thảo luận về cách viết một UDF mẫu bằng Eclipse. Trước khi tiếp tục, hãy đảm bảo rằng bạn đã cài đặt Eclipse và Maven trong hệ thống của mình.
Làm theo các bước dưới đây để viết một hàm UDF -
Mở Eclipse và tạo một dự án mới (giả sử myproject).
Chuyển dự án mới tạo thành dự án Maven.
Sao chép nội dung sau trong pom.xml. Tệp này chứa các phụ thuộc Maven cho các tệp jar Apache Pig và 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>
Lưu tệp và làm mới nó. bên trongMaven Dependencies , bạn có thể tìm thấy các tệp jar đã tải xuống.
Tạo một tệp lớp mới với tên Sample_Eval và sao chép nội dung sau vào đó.
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();
}
}
Trong khi viết UDF, bắt buộc phải kế thừa lớp EvalFunc và cung cấp triển khai exec()chức năng. Trong chức năng này, mã cần thiết cho UDF được viết. Trong ví dụ trên, chúng tôi đã trả về mã để chuyển đổi nội dung của cột đã cho thành chữ hoa.
Sau khi biên dịch lớp mà không có lỗi, nhấp chuột phải vào tệp Sample_Eval.java. Nó cung cấp cho bạn một menu. Lựa chọnexport như thể hiện trong ảnh chụp màn hình sau đây.
Khi nhấp vào export, bạn sẽ nhận được cửa sổ sau. Bấm vàoJAR file.
Tiếp tục bằng cách nhấp vào Next>cái nút. Bạn sẽ nhận được một cửa sổ khác, nơi bạn cần nhập đường dẫn trong hệ thống tệp cục bộ, nơi bạn cần lưu trữ tệp jar.
Cuối cùng nhấp vào Finishcái nút. Trong thư mục được chỉ định, một tệp Jarsample_udf.jarđược tạo ra. Tệp jar này chứa UDF được viết bằng Java.
Sử dụng UDF
Sau khi ghi UDF và tạo tệp Jar, hãy làm theo các bước dưới đây:
Bước 1: Đăng ký tệp Jar
Sau khi viết UDF (bằng Java), chúng ta phải đăng ký tệp Jar có chứa UDF bằng toán tử Đăng ký. Bằng cách đăng ký tệp Jar, người dùng có thể xác định vị trí của UDF thành Apache Pig.
Syntax
Dưới đây là cú pháp của nhà điều hành Đăng ký.
REGISTER path;
Example
Ví dụ, chúng ta hãy đăng ký sample_udf.jar được tạo trước đó trong chương này.
Khởi động Apache Pig ở chế độ cục bộ và đăng ký tệp jar sample_udf.jar như hình dưới đây.
$cd PIG_HOME/bin
$./pig –x local
REGISTER '/$PIG_HOME/sample_udf.jar'
Note - giả sử tệp Jar trong đường dẫn - /$PIG_HOME/sample_udf.jar
Bước 2: Xác định Bí danh
Sau khi đăng ký UDF, chúng ta có thể xác định bí danh cho nó bằng cách sử dụng Define nhà điều hành.
Syntax
Dưới đây là cú pháp của toán tử Xác định.
DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };
Example
Xác định bí danh cho sample_eval như hình dưới đây.
DEFINE sample_eval sample_eval();
Bước 3: Sử dụng UDF
Sau khi xác định bí danh, bạn có thể sử dụng UDF giống như các chức năng được tích hợp sẵn. Giả sử có một tệp có tên emp_data trong HDFS/Pig_Data/ thư mục với nội dung sau.
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
Và giả sử chúng ta đã tải tệp này vào Pig như hình bên dưới.
grunt> emp_data = LOAD 'hdfs://localhost:9000/pig_data/emp1.txt' USING PigStorage(',')
as (id:int, name:chararray, age:int, city:chararray);
Bây giờ chúng ta hãy chuyển đổi tên của các nhân viên thành chữ hoa bằng cách sử dụng UDF sample_eval.
grunt> Upper_case = FOREACH emp_data GENERATE sample_eval(name);
Xác minh nội dung của mối quan hệ Upper_case như hình bên dưới.
grunt> Dump Upper_case;
(ROBIN)
(BOB)
(MAYA)
(SARA)
(DAVID)
(MAGGY)
(ROBERT)
(SYAM)
(MARY)
(SARAN)
(STACY)
(KELLY)