从 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 文件
-
将自定义 JAR 文件上传到 Amazon S3 中。
-
使用 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 脚本
-
编写 Python 脚本并将其上传到 Amazon S3 中的位置。它应该是创建该 Pig 集群的同一账户所拥有的存储桶,或者该位置拥有相关权限,使得创建该集群的账户可以进行访问。在此示例中,脚本上传到 s3://amzn-s3-demo-bucket/pig/python。
-
启动 Pig 集群。如果您正在从 Grunt Shell 访问 Pig,请运行交互式集群。如果您正在从脚本运行 Pig 命令,请启动已编写脚本的 Pig 集群。此示例将启动交互式集群。有关如何创建 Pig 集群的详细信息,请参阅 提交 Pig 工作。
-
有关交互式集群,请使用 SSH 连接到主节点并运行 Grunt Shell。有关更多信息,请参阅通过 SSH 登录主节点。
-
通过在命令行键入
pig
的方式运行 Pig 的 Grunt Shell:pig
-
在 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; -
加载输入数据。以下示例从 Amazon S3 位置加载输入:
grunt> input = load '
s3://amzn-s3-demo-bucket/input/data.txt
' using TextLoader as (line:chararray); -
现在,您可以通过
myfunctions
引用脚本中的函数的方式,从 Pig 内部调用这些函数:grunt> output=foreach input generate myfunctions.myfunction($1);