我可以在Pig脚本中将参数传递给UDF吗?

时间:2012-10-31 17:38:05

标签: apache-pig

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

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

3 个答案:

答案 0 :(得分:3)

这样做的方法是使用DEFINE和UDF的构造函数。以下是客户“拆分器”的示例:

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

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

希望传达这个想法。

答案 1 :(得分:1)

要传递参数,请在您的pigcript中执行以下操作:

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

编辑:不确定这些参数是否需要包裹“或不”

在您的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());
}
}

例如

答案 2 :(得分:0)

是的,您可以传递UDF的Tuple参数输入中的任何参数:

exec(Tuple input)

并使用

访问它
input.get(index)