我见过这个问题,但我还没有看到答案..
是否可以一次从猪身上调用UDF?
我基本上希望将我存储的文本文件转换为通过单次调用java UDF来处理。变换的内部在Java中更容易处理,并且开销很小,所以我宁愿不将逻辑转换为猪...
我成功调用UDF的唯一方法是作为某些数据集的FOREACH语句的一部分。我认为我可以创建一个大小为1的虚拟元组,然后将其用作'foreach'的一部分,但我无法弄清楚创建这个虚拟元组的语法..
UDF不需要返回任何内容,它将处理FS逻辑本身,我只是希望能够在pig脚本中执行它,因为它更有意义在此处进行检测然后作为更大工作流程的一部分..
任何帮助将不胜感激! 谢谢!
答案 0 :(得分:0)
免责声明:不建议将Pig用于此类任务。如果处理适合一个CPU / RAM,为什么还要使用MR?
我遇到了类似问题并使用了自定义StoreFunc实现。
Pig将检查StoreLocation是否存在且OutputFormat是否有效,因此您可以扩展一些现有存储:
public class AdHocProcessing extends PigStorage {
@Override
public void putNext(Tuple tuple) throws IOException {
// here you process input tuples...
}
@Override
public void cleanupOnSuccess(String location, Job job) throws IOException {
// Here you may close your file, db connection, etc.
}
}
}
然后在猪中看起来像:
input = LOAD 'some.txt'
STORE input INTO './somewhere/' USING AdHocProcessing();
您可能还想在rmf ./somewhere
之前添加STORE
(与提示here一样)。
答案 1 :(得分:0)
您还可以执行以下操作:
input_table = LOAD ...;
input_table_all = GROUP input_table All;
-- 'input_table_all' now includes just a single entry
output_table = FOREACH input_table_all GENERATE MyUdf(*);
在UDF内部,您将有一个包含“ all”的元组,然后是输入表,您可以在UDF中处理该表。