Pig:UDF 未返回预期的结果集
Posted
技术标签:
【中文标题】Pig:UDF 未返回预期的结果集【英文标题】:Pig: UDF not returning expected resultset 【发布时间】:2015-02-12 00:49:19 【问题描述】:这是我正在处理的示例数据:
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;
转储不显示任何记录。请让我知道我错过了哪里。
【问题讨论】:
【参考方案1】:tuple.size() > 0
条件是always true
在if stmt
,所以它永远不会去try block(ie filtering logic)
,这就是你得到空结果的原因。你能像这样改变if条件吗?
System.out.println("TupleSize="+tuple.size());
if(tuple == null || tuple.size() < 0)
return false;
控制台中的示例调试输出:
2015-02-13 07:40:46,994 [Thread-2] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigMapOnly$Map - Aliases being processed per job phase (AliasName[line,offset]): M: records[3,10],records[-1,-1],filtered_records[4,19] C: R:
TupleSize=1
TupleSize=1
TupleSize=1
【讨论】:
有什么方法可以调试 Pig UDF 的 java 代码吗? 为了调试,我会一直使用 System.out.println() 命令。它非常易于使用,并且输出将打印在控制台中。例如,如果要检查UDF代码中tuple.size()的值,只需在if条件上方添加stmt System.out.println("TupleSize="+tuple.size()); ,当您运行 pig 脚本时,输出将显示在控制台中。注意:如果对UDF代码做任何改动,一定要编译生成jar文件,否则改动不会反映。用系统命令更新了答案。【参考方案2】:这将为所有行返回false
:
if (tuple == null || tuple.size() > 0)
return false;
这是获取userName
而不是age
:
Object object = tuple.get(0);
【讨论】:
以上是关于Pig:UDF 未返回预期的结果集的主要内容,如果未能解决你的问题,请参考以下文章