2013-02-17 44 views
1

我要求从HDFS读取数百万条记录,将它们充实并将它们作为XML文件存储在每个XML文件的一批10K条记录中。Pig Accumulator接口实现的任何良好示例都有效吗?

我一直在试验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

累加器接口不能保证每次都被行使。这本书编程猪outlines where the accumulator interface won't be honoured

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

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

相关问题