无法从 Pig 解析 Java UDF 中的方法

Posted

技术标签:

【中文标题】无法从 Pig 解析 Java UDF 中的方法【英文标题】:cannot resolve method in Java UDF from Pig 【发布时间】:2015-09-05 01:43:13 【问题描述】:

我在这里使用 Pig on Hadoop 和 DataFu 示例 (http://datafu.incubator.apache.org/docs/datafu/guide/set-operations.html),这是我的代码和错误消息,有人有什么想法吗?谢谢。

register datafu-1.2.0.jar;
define setDifference datafu.pig.sets.SetDifference();

-- ((3),(4),(1),(2),(7),(5),(6),(1),(3),(5),(12))
input = load 'input.txt' AS (B1:bagT:tuple(val:int),B2:bagT:tuple(val:int));

differenced = FOREACH input 
  -- input bags must be sorted
  sorted_b1 = ORDER B1 by val;
  sorted_b2 = ORDER B2 by val;
  GENERATE SetDifference(sorted_b1,sorted_b2);


-- produces: ((2),(4),(6),(7))
DUMP differenced;

[main] 错误 org.apache.pig.tools.grunt.Grunt - 错误 1070:无法使用导入解析 SetDifference:

提前致谢, 林

【问题讨论】:

试试下面的方法:检查UDF的路径是否有效datafu.pig.sets.SetDifference();如果路径有效,尝试重启Grunt,你还会遇到吗? @Flowryn,感谢您的建议,您是什么意思到 UDF 的路径是正确的?更多细节表示赞赏。 对不起,我没有仔细阅读,问题在另一部分。包是正确的,你在这里使用了一个库。我还必须运行代码,现在我不在办公室。 (后来编辑:“路径”我的意思是“包”,再次抱歉混淆) 【参考方案1】:

@LinMa : 看起来您在访问 UDF 时使用了错误的大小写。

为访问 UDF 定义的别名是:

定义setDifference数据fu.pig.sets.SetDifference();

在使用/调用方法时必须使用别名。

GENERATE setDifference(sorted_b1,sorted_b2);

【讨论】:

感谢您的建议。我想我已经使用了名称“setDifference”?没有? @LinMa :在生成语句中,我看到 setDifference 方法名称是大写的,根据您的定义语句,它应该是小写的。 谢谢,看来您也在使用大写字母——“datafu.pig.sets.SetDifference();”?这就是我感到困惑的原因。 :) 我明白你的意思。谢谢,很高兴知道它在使用别名时区分大小写。 :)

以上是关于无法从 Pig 解析 Java UDF 中的方法的主要内容,如果未能解决你的问题,请参考以下文章

Pig 中的 Python UDF

Java中的Pig UDF:错误---错误1066:无法打开别名的迭代器

从 Pig UDF Java 类、Amazon EMR 中的分布式缓存访问文件

Pig 中的 Udfs 共享上下文

显示结果中的 Pig Udf

多个元组作为用 Java 编写的 pig UDF 中的输入