在Pig on Hadoop上我有一个Java UDF被应用于大元组,它只占用了大元组的4个字段,并且(在一些非常重要的计算之后)返回两个新的值,我将其添加到大元组中。
没有减少阶段。
这可以从代数或累积中受益吗?
在没有任何分组的情况下,我看不出它会如何改善速度。看起来分组只是为了试图获得加速是一个朝着错误方向的巨大飞跃。
答案 0 :(得分:1)
不,我认为你正在创建一个普通的EvalFunc
。将其设为Algebraic
或Accumulative
是没有意义的。
LOWER或REGEX_EXTRACT是未实现您提及的任何接口的其他EvalFunc
的示例。
答案 1 :(得分:1)
Algebraic
接口通过利用Hadoop的合并器工作,这就像真正的缩减阶段之前的迷你缩减阶段一样。因此,如果您实际上没有进行任何缩减,则此接口无关紧要。
Accumulator
不一定与减少阶段相关联。它只是一种在UDF中处理非常大的包的方法。这种包装通常是分组的结果,但不一定是这种情况。 Pig不会一次装入整个袋子,而是一次装载它,跟踪最终产生最终结果所需的东西。我不知道它适合您的情况,但它可以在仅限地图的情况下使用。
但是,你提到你有一个非常大的元组。如果你的确意味着元组,而不是包,那么Accumulator
无法帮助你。
作为旁注,Accumulator
的目的不是为了加快计算速度(尽管这可能是适合内存的行李的结果,但由于垃圾收集而几乎没有)。它允许您处理因内存限制而无法完全处理的行李。将其与Algebraic
进行对比,这实际上是一种加速机制,它通过减少(ha!)发送到Reducer并在shuffle阶段写入磁盘的数据量。