2012-10-31 125 views
6

我对PigScript比较新。我想知道是否有一种将参数传递给Pig中的Java UDF的方法?我可以将参数传递给Pig脚本中的UDF吗?

这里是场景: 我有一个日志文件有不​​同的列(每个表示主键在另一个表)。我的任务是获取所选列中不同主键值的计数。 我写了一个Pig脚本,它可以完成获取不同的主键并对它们进行计数的工作。 但是,我现在应该为每列写一个新的UDF。有一个更好的方法吗?就像我可以将行号作为参数传递给UDF一样,它避免了我编写多个UDF的需要。

exec(Tuple input) 

和访问使用

input.get(index) 

回答

0

是的,你可以在你的UDF的元组参数输入传递任何参数的UDF。所以这里是一个客户“分离器”的例子:

REGISTER com.sample.MyUDFs.jar; 
DEFINE CommaSplitter com.sample.MySplitter(','); 

B = FOREACH A GENERATE f1, CommaSplitter(f2); 

希望传达这个想法。

+0

是的弗雷德。但是,我如何从PigScript方传递参数? – emkay

+0

我不知道这是不是你想要做的事情,但是你可以创建一个新的Tuple,主键作为第一个字段,你实际想要传递给你的UDF的数据作为剩余的字段:'FOREACH tupleForUdf GENERATE primarykey,*;' – Frederic

3

的方式做到这一点是通过使用DEFINE和构造:

1

要通过你在你的pigscript以下参数:

UDF(document, '$param1', '$param2', '$param3') 

编辑:不知道如果这些PARAMS必须wrappedin '' 或不

,而在你的UDF你这样做:

public class UDF extends EvalFunc<Boolean> { 



public Boolean exec(Tuple input) throws IOException { 

    if (input == null || input.size() == 0) 
     return false; 

    FileSystem fs = FileSystem.get(UDFContext.getUDFContext().getJobConf()); 


    String var1 = input.get(1).toString(); 
    InputStream var1In = fs.open(new Path(var1)); 


    String var2 = input.get(2).toString(); 
    InputStream var2In = fs.open(new Path(var2)); 

    String var3 = input.get(3).toString(); 
    InputStream var3In = fs.open(new Path(var3)); 



    return doyourthing(input.get(0).toString()); 
} 
} 

例如

相关问题