在 Apache Pig 中运行 UDF
Posted
技术标签:
【中文标题】在 Apache Pig 中运行 UDF【英文标题】:Run UDF in Apache Pig 【发布时间】:2014-11-26 19:49:12 【问题描述】:我想尽办法使用 Pig 从 Grunt 调用 Java 函数。我对 Hadoop 相当陌生,而且我已经好几年没有使用过 Linux 或 Java(我是一个 .Net 女孩)。我已经从 PiggyBank.jar 获得了功能,这是提供的。我在 Eclipse 中编写了一个简单的测试类,并将 jar 文件导出到我的根文件夹以供 Grunt 使用。我按以下顺序运行这些命令并得到以下错误。
grunt> Register KellyProject1.jar
grunt> grades = load 'grades.txt' as (studentName:charArray, <etc> );
grunt> grades2 = foreach grades generate studentName, hadoop.Upper(studentName);
错误 org.apache.pig.tools.grunt.Grunt - 错误 1070:无法使用导入解析 hadoop.Upper:[、java.lang.、org.apache.pig.builtin.、org.apache.pig。 impl.builtin.]
Upper.java:
package hadoop;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
public class Upper extends EvalFunc<String>
public String exec(Tuple input) throws IOException
if (input == null || input.size() == 0)
return null;
try
//String str = (String)input.get(0);
String str = "something";
return str.toUpperCase();
catch(Exception e)
throw new IOException("Caught exception processing input row ", e);
起初我在一个普通类中写了一个简单的“hello world”静态方法,然后我在网上看到了所有这些扩展 EvalFunc 的例子,所以我把那个 java 代码复制了下来。还想知道我是否只是不明白如何正确生成/导出 jar 文件? Eclipse 设置为自动构建,所以我只需右键单击项目名称并转到导出并将 jar 文件放入我的 Cloudera 文件夹中。很难让我的大脑远离 Visual Studio 和 dll。
【问题讨论】:
好吧,结果证明这段代码非常好。我重新启动命令行并运行 grunt 然后它工作了。我现在想把我的电脑扔出窗外。 【参考方案1】:你不需要在 pig 中使用“hadoop”这个词,因为它通常会在这个词上抛出错误。 当然,注册 jar 是正确的一步,但更重要的一步是告诉猪你作为 UDF 使用的类的完全限定名称(在你的情况下是 Java 函数)。 有两种情况
案例 1:这是您定义自己的 UDF 时的情况。
grunt> Register KellyProject1.jar
grunt> DEFINE YourUdfName FullyQualifiedname;
grunt> grades = load 'grades.txt' as (studentName:charArray, <etc> );
grunt> grades2 = foreach grades generate studentName, YourUdfName(studentName);
只需确保您注册的 Jar 必须包含您正在使用的完全限定名称的类
案例 2:当您尝试在 hadoop 包中使用现有的 PIG UDF 时就是这种情况。
grunt> grades2 = foreach grades generate studentName,UPPER(studentName);
第二种情况是您尝试使用 hadoop 包中提供的内置 pig 功能的情况。
因此,对于内置 PIG 函数,我们不需要使用完全限定名称。
【讨论】:
【参考方案2】:在 Windows 平台上运行时。只需在 ADMIN 模式下打开 cmd 提示符。!!确保您的用户名不包含任何空格..
【讨论】:
以上是关于在 Apache Pig 中运行 UDF的主要内容,如果未能解决你的问题,请参考以下文章
在本地运行 pig,UDF 程序无法写入文件/文件夹:PriviledgedActionException