我在pig中尝试了我的第一个udf,并编写了以下函数-
package com.pig.in.action.assignments.udf;
import org.apache.pig.EvalFunc;
import org.apache.pig.PigWarning;
import org.apache.pig.data.Tuple;
import java.io.IOException;
public class CountLength extends EvalFunc<Integer> {
public Integer exec(Tuple inputVal) throws IOException {
// Validate Input Value ...
if (inputVal == null ||
inputVal.size() == 0 ||
inputVal.get(0) == null) {
// Emit warning text for user, and skip this iteration
super.warn("Inappropriate parameter, Skipping ...",
PigWarning.SKIP_UDF_CALL_FOR_NULL);
return null;
}
// Count # of characters in this string ...
final String inputString = (String) inputVal.get(0);
return inputString.length();
}
}
然而,当我尝试如下使用它时,pig抛出了一个错误消息,在我的udf上下文中,至少对我来说不容易理解:
grunt> cat dept.txt;
10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON
grunt> dept = LOAD '/user/sgn/dept.txt' USING PigStorage(',') AS (dept_no: INT, d_name: CHARARRAY, d_loc: CHARARRAY);
grunt> d = FOREACH dept GENERATE dept_no, com.pig.in.action.assignments.udf.CountLength(d_name);
2015-06-02 16:24:13,416 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <line 2, column 79> mismatched input '(' expecting SEMI_COLON
Details at logfile: /home/sgn/pig_1433261973141.log
有人能帮我找出这有什么问题吗?
我已经阅读了文档,但是上面的示例中没有明显的错误。我是不是漏了什么?
以下是我在pom.xml中使用的库:
<dependency>
<groupId>org.apache.pig</groupId>
<artifactId>pig</artifactId>
<version>0.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.1</version>
</dependency>
是否存在兼容性问题?
谢谢,
-毒蛇;
3条答案
按热度按时间ccrfmcuu1#
在大约36小时的停机时间后找到了问题的原因。。。
包名包含“in”,这在某种程度上是pig的问题。
当我把包名改成以下的时候,一切都很好-
在构建修改后的udf之后,我注册了jar并为函数名和bingo定义了一个别名,一切正常-
我不记得in在pig中是不是一个保留词。但仍然存在in导致问题(至少在pig的0.14.0版本中)。
mctunoxg2#
我试过上面的例子。只要jar是使用register命令注册的,并且jar在类路径中可用,我们就不会看到任何错误。
输入:a.csv
输出:d
n、 b.:在上面的运行中,类countlength已在默认包中定义。
如果在com.pig.utility包中定义了这个class-countlength,那么要访问udf,我们必须有如下的define语句
或
我们必须按以下完整路径引用自定义项:
zzwlnbp83#
您的jar应该注册在: