- Apache Pig 教程
- Apache Pig - 主頁
- Apache Pig 簡介
- Apache Pig - 概述
- Apache Pig - 架構
- Apache Pig 環境
- Apache Pig - 安裝
- Apache Pig - 執行
- Apache Pig - Grunt Shell
- Pig Latin
- Pig Latin - 基礎
- 載入 & 儲存運算子
- Apache Pig - 讀取資料
- Apache Pig - 儲存資料
- 診斷運算子
- Apache Pig - 診斷運算子
- Apache Pig - Describe 運算子
- Apache Pig - Explain 運算子
- Apache Pig - Illustrate 運算子
- 分組 & 連線
- Apache Pig - Group 運算子
- Apache Pig - Cogroup 運算子
- Apache Pig - Join 運算子
- Apache Pig - Cross 運算子
- Pig Latin 內建函式
- Apache Pig - Eval 函式
- 載入 & 儲存函式
- Apache Pig - Bag & Tuple 函式
- Apache Pig - 字串函式
- Apache Pig - 日期時間函式
- Apache Pig - 數學函式
- Apache Pig 有用資源
- Apache Pig - 快速指南
- Apache Pig - 有用資源
- Apache Pig - 討論
Apache Pig - 使用者自定義函式
除了內建函式外,Apache Pig 還廣泛支援**使用者自定義函式**(UDF)。使用這些 UDF,我們可以定義自己的函式並使用它們。UDF 支援以六種程式語言提供,即 Java、Jython、Python、JavaScript、Ruby 和 Groovy。
對於編寫 UDF,Java 提供了完整支援,其他所有語言都提供了有限的支援。使用 Java,您可以編寫涉及所有處理部分的 UDF,例如資料載入/儲存、列轉換和聚合。由於 Apache Pig 是用 Java 編寫的,因此與其他語言相比,使用 Java 語言編寫的 UDF 效率更高。
在 Apache Pig 中,我們還有一個名為**Piggybank**的 Java UDF 儲存庫。使用 Piggybank,我們可以訪問其他使用者編寫的 Java UDF,並貢獻我們自己的 UDF。
Java 中的 UDF 型別
使用 Java 編寫 UDF 時,我們可以建立和使用以下三種類型的函式:
**過濾函式** - 過濾函式用作 filter 語句中的條件。這些函式接受 Pig 值作為輸入並返回布林值。
**Eval 函式** - Eval 函式用於 FOREACH-GENERATE 語句中。這些函式接受 Pig 值作為輸入並返回 Pig 結果。
**代數函式** - 代數函式作用於 FOREACHGENERATE 語句中的內部包。這些函式用於對內部包執行完整的 MapReduce 操作。
使用 Java 編寫 UDF
要使用 Java 編寫 UDF,我們必須整合 jar 檔案**Pig-0.15.0.jar**。在本節中,我們將討論如何使用 Eclipse 編寫一個示例 UDF。在繼續操作之前,請確保您已在系統中安裝了 Eclipse 和 Maven。
按照以下步驟編寫 UDF 函式:
開啟 Eclipse 並建立一個新專案(例如**myproject**)。
將新建立的專案轉換為 Maven 專案。
將以下內容複製到 pom.xml 中。此檔案包含 Apache Pig 和 Hadoop-core jar 檔案的 Maven 依賴項。
<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 依賴項**部分,您可以找到下載的 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 檔案。它會為您提供一個選單。選擇**匯出**,如下面的螢幕截圖所示。
單擊**匯出**後,您將看到以下視窗。單擊**JAR 檔案**。
透過單擊**下一步>**按鈕繼續。您將看到另一個視窗,您需要在本地檔案系統中輸入路徑,您需要在其中儲存 jar 檔案。
最後單擊**完成**按鈕。在指定的資料夾中,將建立一個 Jar 檔案**sample_udf.jar**。此 jar 檔案包含用 Java 編寫的 UDF。
使用 UDF
編寫 UDF 並生成 Jar 檔案後,請按照以下步驟操作:
步驟 1:註冊 Jar 檔案
在編寫 UDF(在 Java 中)後,我們必須使用 Register 運算子註冊包含 UDF 的 Jar 檔案。透過註冊 Jar 檔案,使用者可以將 UDF 的位置告知 Apache Pig。
語法
以下是 Register 運算子的語法。
REGISTER path;
示例
例如,讓我們註冊本章前面建立的 sample_udf.jar。
以本地模式啟動 Apache Pig 並註冊 jar 檔案 sample_udf.jar,如下所示。
$cd PIG_HOME/bin $./pig –x local REGISTER '/$PIG_HOME/sample_udf.jar'
**注意** - 假設 Jar 檔案位於路徑 - /$PIG_HOME/sample_udf.jar
步驟 2:定義別名
註冊 UDF 後,我們可以使用**Define**運算子為其定義別名。
語法
以下是 Define 運算子的語法。
DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };
示例
為 sample_eval 定義別名,如下所示。
DEFINE sample_eval sample_eval();
步驟 3:使用 UDF
定義別名後,您可以像使用內建函式一樣使用 UDF。假設 HDFS ** /Pig_Data/**目錄中有一個名為 emp_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://: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)