有什么好的pig累加器接口实现的例子吗?

sr4lhrrt  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(404)

我需要从hdfs中读取数百万条记录,丰富它们,并将它们存储为一个xml文件,每个xml文件包含10k条记录。
我一直在试验收集器接口,并将pig.accumulative.batchsize设置为2进行测试。
但是,被调用的方法是“exec()”而不是accumulate的“accumulate”方法。
我的自定义项课程大纲如下:

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

am46iovg1#

不能保证每次都执行累加器接口。本书概述了累加器接口将不受尊重的地方:
只要可能,pig将选择在累加器上使用udf的代数实现。这是因为累加器有助于避免将记录溢出到磁盘,但它不能降低网络成本,也不能帮助平衡缩减器。如果foreach中的所有udf都实现累加器,并且至少有一个未实现代数,pig将使用累加器。如果至少有一个不使用蓄能器,清管器将不使用蓄能器。这是因为pig已经必须将整个包读入内存,才能传递给未实现累加器的udf,因此累加器中不再有任何值。
您的udf必须在这两个方面实现其逻辑 exec() 以及 accumulate() . 可以在 COUNT 自定义项。

相关问题