在 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

在 PIG 中执行 UDF 时出错

在 pig 中使用 UDF 时出现错误 1070

Pig 中的 SimpleTextLoader UDF

Apache Pig - 如何维护一个分布式查找表以供我的 python UDF 访问?

Pig UDF 似乎总是在单个减速器中运行 - PARALLEL 不起作用