1

我需要从 HDFS 读取数百万条记录,丰富它们并将它们作为 XML 文件存储在每个 XML 文件的 10K 条记录中。

我一直在尝试使用 Accumulator 接口并将我的 pig.accumulative.batchsize 设置为 2 进行测试。

但是,被调用的方法是“exec()”而不是 Accumulator 的“accumulate”方法。

我的UDF课程大纲如下:

public class MyAccUDF extends EvalFunc <Tuple> implements Accumulator <Tuple>{

    public Tuple exec(Tuple input) throws IOException {
        //..
    }

    public void accumulate(Tuple b) throws IOException {
        //...
    }

    public void cleanup() {
        //..
    }

    public Tuple getValue() {
        //..
    }
}
4

1 回答 1

1

累加器接口不保证每次都被执行。Programming Pig 一书概述了累加器接口不会受到尊重的地方

只要有可能,Pig 将选择使用 UDF 的代数实现而不是累加器。这是因为累加器有助于避免将记录溢出到磁盘,但它不会降低网络成本或帮助平衡减速器。如果 foreach 中的所有 UDF 都实现了累加器,并且至少有一个没有实现代数,Pig 将使用累加器。如果至少有一个不使用累加器,Pig 将不会使用累加器。这是因为 Pig 已经将整个包读入内存以传递给未实现累加器的 UDF,因此累加器中不再有任何值。

您的 UDF 必须在exec()和中实现其逻辑accumulate()。可以在 UDF 中找到这种功能重复的简单COUNT示例

于 2013-04-04T14:16:06.607 回答