我对 PigScript 比较陌生。我想知道是否有办法在 Pig 中将参数传递给 Java UDF?
这是场景:我有一个日志文件,它有不同的列(每个代表另一个表中的主键)。我的任务是获取所选列中不同主键值的计数。我编写了一个 Pig 脚本,它可以获取不同的主键并计算它们。但是,我现在应该为每一列编写一个新的 UDF。有一个更好的方法吗?就像我可以将行号作为参数传递给 UDF 一样,它避免了我编写多个 UDF 的需要。
我对 PigScript 比较陌生。我想知道是否有办法在 Pig 中将参数传递给 Java UDF?
这是场景:我有一个日志文件,它有不同的列(每个代表另一个表中的主键)。我的任务是获取所选列中不同主键值的计数。我编写了一个 Pig 脚本,它可以获取不同的主键并计算它们。但是,我现在应该为每一列编写一个新的 UDF。有一个更好的方法吗?就像我可以将行号作为参数传递给 UDF 一样,它避免了我编写多个 UDF 的需要。
做到这一点的方法是使用DEFINE
和 UDF 的构造函数。所以这里是一个客户“拆分器”的例子:
REGISTER com.sample.MyUDFs.jar;
DEFINE CommaSplitter com.sample.MySplitter(',');
B = FOREACH A GENERATE f1, CommaSplitter(f2);
希望这能传达这个想法。
要传递参数,您可以在 pigscript 中执行以下操作:
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());
}
}
例如
是的,您可以在 UDF 的元组参数输入中传递任何参数:
exec(Tuple input)
并使用
input.get(index)