我需要从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() {
//..
}
}
答案 0 :(得分:1)
不保证每次都会运行累加器接口。编程猪outlines where the accumulator interface won't be honoured一书:
只要有可能,Pig会选择使用UDF的代数实现 累加器。这是因为累加器有助于避免将记录溢出到磁盘, 但它不会降低网络成本或帮助平衡减速器。如果所有UDF都在 foreach实现Accumulator并且至少有一个没有实现代数,Pig会 使用累加器。如果至少有一个不使用累加器,猪将不会使用 累加器。这是因为猪已经必须将整个行李读入内存才能通过 到没有实现累加器的UDF,因此不再有任何值 在累加器中。
您的UDF必须在exec()
和accumulate()
中实现其逻辑。可以在the COUNT
UDF中找到这种功能重复的简单示例。