

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 从 Pig 调用由用户定义的函数
<a name="emr-pig-udf"></a>

Pig 提供了从 Pig 脚本中调用用户定义的函数 (UDFs) 的功能。您可以完成此操作，以便实施自定义处理并在 Pig 脚本使用。目前支持的语言有 Java、Python/Jython 和 JavaScript （尽管 JavaScript支持仍处于实验阶段。） 

以下部分描述了如何通过 Pig 注册函数，以便从 Pig Shell 或者从 Pig 脚本内部调用它们。有关与 Pig UDFs 一起使用的更多信息，请参阅您的 [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 文件。

**与 Pig 一起使用 JAR 文件**

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);
   ```