有啥好的 Pig Accumulator 接口实现的例子吗?
Posted
技术标签:
【中文标题】有啥好的 Pig Accumulator 接口实现的例子吗?【英文标题】:Any good examples of Pig Accumulator Interface implementation that works?有什么好的 Pig Accumulator 接口实现的例子吗? 【发布时间】:2013-02-17 17:46:06 【问题描述】:我需要从 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()
//..
【问题讨论】:
【参考方案1】:累加器接口不保证每次都被执行。本书编程猪outlines where the accumulator interface won't be honoured:
只要有可能,Pig 将选择使用 UDF 的代数实现而不是 蓄能器。这是因为累加器有助于避免将记录溢出到磁盘, 但它不会降低网络成本或帮助平衡减速器。如果一个中的所有 UDF foreach 实现 Accumulator 和至少一个不实现 Algebraic,Pig 会 使用蓄能器。如果至少有一个不使用累加器,Pig 将不会使用 累加器。这是因为 Pig 已经将整个包读入内存才能通过 到不实现累加器的UDF,所以不再有任何值 在累加器中。
您的 UDF 必须在 exec()
和 accumulate()
中实现其逻辑。在the COUNT
UDF 中可以找到这种重复功能的简单示例。
【讨论】:
以上是关于有啥好的 Pig Accumulator 接口实现的例子吗?的主要内容,如果未能解决你的问题,请参考以下文章