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 trueif 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 未返回预期的结果集的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个接受查询字符串并返回查询结果集的 UDF

执行从 UDF 返回的语句时出现问题 - 没有结果集

显示结果中的 Pig Udf

左外连接不返回预期的结果集

Hive UDF 不返回预期结果

触发器返回了一个结果集和/或在另一个未完成的结果集处于活动状态时以 SET NOCOUNT OFF 运行