我想了解一下,mapPartitions函数在以下代码中的行为如何?它是否在每次迭代中创建单独的分区并将它们分配给节点。或者分区和分区到节点的映射是否在迭代中保留?
理想情况下,我希望为整个循环保持相同的分区。
for i in range(10):
x = rdd.mapPartitions(fun).reduce(lambda a,b:a+b)
答案 0 :(得分:3)
这取决于。如果rdd
被缓存,那么分区将被计算一次并在迭代中保留,除非出现某种故障并且任务被重新安排在另一个工作者上。否则,每次迭代都会重新计算。在这种情况下,答案取决于rdd
的谱系。如果没有涉及洗牌,或者您使用确定性分区和排序,则答案是肯定的。否则,您不太可能在每次迭代中看到相同的内容。
如果您担心性能,那么缓存就足够了。如果你考虑在mapPartitions
中执行一些副作用,并且希望在迭代之间保留这些副作用,那么你就不能依赖它。