仅映射的UDF是否可以从代数或累积中受益?

时间:2014-02-18 20:42:39

标签: java hadoop apache-pig

在Pig on Hadoop上我有一个Java UDF被应用于大元组,它只占用了大元组的4个字段,并且(在一些非常重要的计算之后)返回两个新的值,我将其添加到大元组中。

没有减少阶段。

  

这可以从代数或累积中受益吗?

在没有任何分组的情况下,我看不出它会如何改善速度。看起来分组只是为了试图获得加速是一个朝着错误方向的巨大飞跃。

2 个答案:

答案 0 :(得分:1)

不,我认为你正在创建一个普通的EvalFunc。将其设为AlgebraicAccumulative是没有意义的。

LOWERREGEX_EXTRACT是未实现您提及的任何接口的其他EvalFunc的示例。

答案 1 :(得分:1)

Algebraic接口通过利用Hadoop的合并器工作,这就像真正的缩减阶段之前的迷你缩减阶段一样。因此,如果您实际上没有进行任何缩减,则此接口无关紧要。

另一方面,

Accumulator不一定与减少阶段相关联。它只是一种在UDF中处理非常大的包的方法。这种包装通常是分组的结果,但不一定是这种情况。 Pig不会一次装入整个袋子,而是一次装载它,跟踪最终产生最终结果所需的东西。我不知道它适合您的情况,但它可以在仅限地图的情况下使用。

但是,你提到你有一个非常大的元组。如果你的确意味着元组,而不是包,那么Accumulator无法帮助你。

作为旁注,Accumulator的目的不是为了加快计算速度(尽管这可能是适合内存的行李的结果,但由于垃圾收集而几乎没有)。它允许您处理因内存限制而无法完全处理的行李。将其与Algebraic进行对比,这实际上是一种加速机制,它通过减少(ha!)发送到Reducer并在shuffle阶段写入磁盘的数据量。