我正在编写PySpark命令RDD.aggregate
的函数,它要求输出以下参数:aggregate(zeroValue, seqOp, combOp)
。
我可以为这些参数的所有使用可变对象,而不会弄乱逻辑吗?
基本上为了效率,我希望调用类似
的内容zeroValue.add(other)
def seqOp(x1, x2): return x1.add(x2)
def seqOp(x1, x2): return x1.combine(x2)
所有方法都将return self
。这样我就不必重新分配对象了。
答案 0 :(得分:2)
是的,您可以将可变对象用作fold(ByKey)
或aggregate(ByKey)
等方法的聚合缓冲区,因为它在docstring中有明确说明:
允许函数op(t1,t2)修改t1并将其作为结果值返回以避免对象分配;但是,它不应该修改t2。
缓冲区(zeroValue
)每个任务初始化一次,因此可以安全地进行变异。