Java Pig:UDF未返回预期结果集
这是我正在研究的样本数据:Java Pig:UDF未返回预期结果集,java,hadoop,mapreduce,apache-pig,bigdata,Java,Hadoop,Mapreduce,Apache Pig,Bigdata,这是我正在研究的样本数据: Peter Wilkerson 27 M James Owen 26 M Matt Wo 30 M Kenny Chen 28 M 我创建了一个简单的UDF,用于像这样过滤年龄: public class IsApplicable extends FilterFunc { @Override public Boolean exec(Tuple tuple) throws IOException {
Peter Wilkerson 27 M
James Owen 26 M
Matt Wo 30 M
Kenny Chen 28 M
我创建了一个简单的UDF
,用于像这样过滤年龄:
public class IsApplicable extends FilterFunc {
@Override
public Boolean exec(Tuple tuple) throws IOException {
if(tuple == null || tuple.size() > 0){
return false;
}
try {
Object object = tuple.get(0);
if(object == null){
return false;
}
int age = (Integer)object;
return age > 28;
} catch (Exception e) {
throw new IOException(e);
}
}
}
这是我用于使用此UDF的脚本:
records = LOAD '~/Documents/data.txt' AS (firstname:chararray,lastname:chararray,age:int,gender:chararray);
filtered_records = FILTER records BY com.udf.IsApplicable(age);
dump filtered_records;
转储不显示任何记录。请让我知道我错过了哪里。tuple.size()>0
条件是if stmt
中的始终为true
,因此它永远不会转到try块(即过滤逻辑)
,这就是您得到空结果的原因。你能像这样改变if条件吗
System.out.println("TupleSize="+tuple.size());
if(tuple == null || tuple.size() < 0){
return false;
}
这将返回所有行的
false
:
if (tuple == null || tuple.size() > 0) {
return false;
}
这是获取用户名
,而不是年龄
:
Object object = tuple.get(0);
有什么方法可以调试Pig UDF的java代码吗?对于调试,我将始终使用System.out.println()命令。它非常易于使用,并且输出将在控制台中打印。例如,如果要检查UDF代码中tuple.size()的值,只需将stmt添加到if条件System.out.println(“TupleSize=“+tuple.size()),运行pig脚本时,输出将显示在控制台中。注意:如果您在UDF代码中做了任何更改,请确保编译并生成jar文件,否则更改将不会反映出来。用系统命令更新了答案。
Object object = tuple.get(0);