仅在Pig中执行一次UDF

时间:2014-02-25 20:25:27

标签: java apache-pig

我见过这个问题,但我还没有看到答案..

是否可以一次从猪身上调用UDF?

我基本上希望将我存储的文本文件转换为通过单次调用java UDF来处理。变换的内部在Java中更容易处理,并且开销很小,所以我宁愿不将逻辑转换为猪...

我成功调用UDF的唯一方法是作为某些数据集的FOREACH语句的一部分。我认为我可以创建一个大小为1的虚拟元组,然后将其用作'foreach'的一部分,但我无法弄清楚创建这个虚拟元组的语法..

UDF不需要返回任何内容,它将处理FS逻辑本身,我只是希望能够在pig脚本中执行它,因为它更有意义在此处进行检测然后作为更大工作流程的一部分..

任何帮助将不胜感激! 谢谢!

2 个答案:

答案 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中处理该表。