从 Pig 调用由用户定义的函数 - Amazon EMR

从 Pig 调用由用户定义的函数

Pig 提供从 Pig 脚本内部调用用户定义的函数 (UDF) 的功能。您可以完成此操作,以便实施自定义处理并在 Pig 脚本使用。当前受支持的语言为 Java、Python/Jython 和 JavaScript (不过,对于 JavaScript 的支持仍然是试验性的。)

以下部分描述了如何通过 Pig 注册函数,以便从 Pig Shell 或者从 Pig 脚本内部调用它们。有关将 Pig 与 UDF 一起使用的更多信息,请参阅适用于您的 Pig 版本的 Pig 文档

从 Pig 中调用 JAR 文件

您可以在 Pig 脚本中使用 REGISTER 命令,从而通过 Pig 使用自定义 JAR 文件。JAR 文件在本地或者在远程文件系统(如 Amazon S3)上。当 Pig 脚本运行时,Amazon EMR 会自动下载 JAR 文件到主节点上,然后将 JAR 文件上传到 Hadoop 分布式缓存。通过这种方法,集群中的所有实例可自动地根据需要使用该 JAR 文件。

与 Pig 一起使用 JAR 文件
  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);