

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 從 Pig 呼叫使用者定義函數
<a name="emr-pig-udf"></a>

Pig 可讓您從 Pig 指令碼呼叫使用者定義函數 (UDF)。您可以執行此操作來實作自訂處理，以用於您的 Pig 指令碼。目前支援的語言是 Java、Python/Jython 和 JavaScript (雖然 JavaScript 的支援仍在實驗中。) 

以下區段說明如何使用 Pig 註冊您的函數，讓您可以從 Pig shell 或 Pig 指令碼呼叫他們。如需有關使用 UDF 搭配 Pig 的詳細資訊，請參閱適用於所使用 Pig 版本的 [Pig 文件](http://pig.apache.org/docs/)。

## 從 Pig 呼叫 JAR 檔案
<a name="UsingJarsWithPig"></a>

您可以在 Pig 指令碼使用 `REGISTER` 命令來透過 Pig 使用自訂的 JAR 檔案。JAR 檔案是本機或遠端檔案系統 (例如 Amazon S3)。Pig 指令碼執行時，Amazon EMR 會將 JAR 檔案自動下載到主節點，然後將 JAR 檔案上傳到 Hadoop 分散式快取。叢集的所有執行個體將視需要以這種方式自動使用 JAR 檔案。

**若要使用 JAR 檔案搭配 Pig**

1. 將您的自訂 JAR 檔案上傳到 Amazon S3。

1. 在 Pig 指令碼中使用 `REGISTER` 命令來在自訂 JAR 檔案的 Amazon S3 上指定儲存貯體。

   ```
   REGISTER s3://amzn-s3-demo-bucket/path/mycustomjar.jar;
   ```

## 從 Pig 呼叫 Python/Jython 指令碼
<a name="emr-pig-udf-jython"></a>

您可以使用 Pig 註冊 Python 指令碼，然後從 Pig shell 在那些指令碼中或在 Pig 指令碼中呼叫函數。您可以透過指定含 `register` 關鍵字的指令碼位置來這麼做。

由於 Pig 是以 Java 編寫，它會使用 Jython 指令碼引擎來剖析 Python 指令碼。如需 Jython 的詳細資訊，請前往 [http://www.jython.org/](http://www.jython.org/)。

**從 Pig 呼叫 Python/Jython 指令碼**

1. 撰寫 Python 指令碼並將指令碼上傳至 Amazon S3 中的位置。這應該是由建立 Pig 叢集或有設定許可之相同帳戶所擁有的儲存貯體，可讓建立叢集的帳戶可以進行存取。在此範例中，指令碼會上傳至 s3：//amzn-s3-demo-bucket/pig/python。

1. 啟動 Pig 叢集。如果您是從 Grunt shell 存取 Pig，請執行互動式叢集。如果您是從指令碼執行 Pig 命令，請啟動以指令碼編寫的 Pig 叢集。此範例會啟動互動式叢集。如需建立 Pig 叢集方式的詳細資訊，請參閱 [提交 Pig 工作](emr-pig-launch.md)。

1. 對於互動式叢集，請使用 SSH 連接到主節點和執行 Grunt shell。如需詳細資訊，請參閱[使用 SSH 連線至主節點](https://docs.aws.amazon.com/emr/latest/DeveloperGuide/EMR_SetUp_SSH.html)。

1. 透過在命令列輸入 `pig` 來針對 Pig 執行 Grunt shell：

   ```
   pig
   ```

1. 在 Grunt 命令提示字元使用 `register` 關鍵字搭配 Pig 註冊 Jython 程式庫和 Python 指令碼，如以下命令所示，其中您可以在 Amazon S3 中指定指令碼的位置：

   ```
   grunt> register 'lib/jython.jar';
   grunt> register 's3://amzn-s3-demo-bucket/pig/python/myscript.py' using jython as myfunctions;
   ```

1.  載入輸入資料。以下範例會從 Amazon S3 位置載入輸入：

   ```
   grunt> input = load 's3://amzn-s3-demo-bucket/input/data.txt' using TextLoader as (line:chararray);
   ```

1.  您現在可以透過使用 `myfunctions` 來參考函數以從 Pig 在指令碼中呼叫它們：

   ```
   grunt> output=foreach input generate myfunctions.myfunction($1);
   ```