在Apache Pig中运行UDF

时间:2014-11-26 19:49:13

标签: hadoop apache-pig

我最终试图使用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很难。

2 个答案:

答案 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提示符。!!确保您的用户名不包含任何空格..