Pig Accumulator Interface实现的任何好例子都有效吗?

时间:2013-02-17 17:46:07

标签: performance apache-pig udf

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

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

然而,被调用的方法是" exec()"而不是累积器"积累"方法

我的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() {
        //..
    }
}

1 个答案:

答案 0 :(得分:1)

不保证每次都会运行累加器接口。编程猪outlines where the accumulator interface won't be honoured一书:

  

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

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