從 Pig 呼叫使用者定義函數 - Amazon EMR

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

從 Pig 呼叫使用者定義函數

Pig 提供從 Pig 指令碼內呼叫使用者定義函數 (UDFs) 的功能。您可以執行此操作來實作自訂處理,以用於您的 Pig 指令碼。目前支援的語言為 Java、Python/Jython 和 JavaScript (雖然 JavaScript支援仍為實驗性。)

以下區段說明如何使用 Pig 註冊您的函數,讓您可以從 Pig shell 或 Pig 指令碼呼叫他們。如需UDFs搭配 Pig 使用 的詳細資訊,請參閱適用於您 Pig 版本的 Pig 文件

從 Pig 呼叫JAR檔案

您可以使用 Pig 指令碼中的 REGISTER命令搭配 Pig 使用自訂JAR檔案。JAR 檔案是本機或遠端檔案系統,例如 Amazon S3。當 Pig 指令碼執行時,Amazon 會自動將JAR檔案EMR下載至主節點,然後將JAR檔案上傳至 Hadoop 分散式快取。如此一來,叢集中的所有執行個體都會視需要自動使用該JAR檔案。

將JAR檔案與 Pig 搭配使用
  1. 將自訂JAR檔案上傳至 Amazon S3。

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

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

從 Pig 呼叫 Python/Jython 指令碼

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

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

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

  2. 啟動 Pig 叢集。如果您是從 Grunt shell 存取 Pig,請執行互動式叢集。如果您是從指令碼執行 Pig 命令,請啟動以指令碼編寫的 Pig 叢集。此範例會啟動互動式叢集。如需建立 Pig 叢集方式的詳細資訊,請參閱 提交 Pig 工作

  3. 對於互動式叢集,請使用 SSH 連線到主節點並執行 Grunt Shell。如需詳細資訊,請參閱SSH主節點 中的

  4. 透過在命令列輸入 pig 來針對 Pig 執行 Grunt shell:

    pig
  5. 在 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;
  6. 載入輸入資料。以下範例會從 Amazon S3 位置載入輸入:

    grunt> input = load 's3://amzn-s3-demo-bucket/input/data.txt' using TextLoader as (line:chararray);
  7. 您現在可以透過使用 myfunctions 來參考函數以從 Pig 在指令碼中呼叫它們:

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