在apache pig中运行udf

ffscu2ro  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(407)

我在尝试使用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);

error org.apache.pig.tools.grunt.grunt-错误1070:无法使用导入解析hadoop.upper:[,java.lang.,org.apache.pig.builtin.,org.apache.pig.impl.builtin.]
上.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);
        }
    }
}

起初我在一个普通类中编写了一个简单的“helloworld”静态方法,然后我在网上看到了所有这些扩展evalfunc的示例,所以我把java代码复制了下来。还想知道我是否只是不明白如何正确地生成/导出jar文件?eclipse设置为自动构建,所以我只需右键单击项目名称并转到export,然后让它将jar文件放在我的cloudera文件夹中。很难让我的大脑远离visualstudio和dll。

5us2dqdw

5us2dqdw1#

你不需要在pig中使用hadoop这个词,因为它通常会在这个词上出现错误。当然,注册jar是正确的一步,但更重要的一步是告诉pig类的完全限定名,您将其用作udf(本例中的java函数)。有两种情况
案例1:定义自己的自定义项时就是这样。

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函数。
因此,对于内置的pig函数,我们不需要使用完全限定名。

fgw7neuy

fgw7neuy2#

在windows平台上运行时。只需在管理模式下打开cmd提示符。!!确保您的用户名不包含任何空格。。

相关问题