我最终试图使用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设置为自动构建,因此我只需右键单击项目名称并转到Export并将jar文件放入Cloudera文件夹中。让我的大脑远离Visual Studio和dll很难。
答案 0 :(得分:1)
你不需要&#39; hadoop&#39;猪中的单词通常会在这个单词上引发错误。 当然注册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必须包含您在FullyQualified name
中使用的类案例2:当您尝试在hadoop包中使用现有的PIG UDF时就是这种情况。
grunt> grades2 = foreach grades generate studentName,UPPER(studentName);
第二种情况是您尝试使用hadoop包中提供的内置猪功能的情况。
因此,对于内置的PIG函数,我们不需要使用完全限定的名称。
答案 1 :(得分:0)
在Windows平台上运行时。只需在ADMIN模式下打开cmd提示符。!!确保您的用户名不包含任何空格..