Mapreduce mapPartitions在循环中的行为如何?
我想了解mapPartitions函数在以下代码中的行为。它是否在每次迭代中创建单独的分区并将它们分配给节点。或者分区和分区到节点的映射在迭代过程中保持不变 理想情况下,我希望整个循环保持相同的分区Mapreduce mapPartitions在循环中的行为如何?,mapreduce,apache-spark,pyspark,Mapreduce,Apache Spark,Pyspark,我想了解mapPartitions函数在以下代码中的行为。它是否在每次迭代中创建单独的分区并将它们分配给节点。或者分区和分区到节点的映射在迭代过程中保持不变 理想情况下,我希望整个循环保持相同的分区 for i in range(10): x = rdd.mapPartitions(fun).reduce(lambda a,b:a+b) 视情况而定。如果缓存了rdd,则分区将被计算一次并在迭代过程中保留,除非出现某种故障,并且任务被重新调度到另一个工作进程上。否则,将为每个迭代重新计算
for i in range(10):
x = rdd.mapPartitions(fun).reduce(lambda a,b:a+b)
视情况而定。如果缓存了
rdd
,则分区将被计算一次并在迭代过程中保留,除非出现某种故障,并且任务被重新调度到另一个工作进程上。否则,将为每个迭代重新计算它。在这种情况下,答案取决于rdd
的血统。如果不涉及洗牌,或者使用确定性分区和排序,那么答案是肯定的。否则,您不可能在每次迭代中看到相同的内容
如果您关心性能,那么缓存就足够了。如果您考虑在
mapPartitions
中执行一些副作用,并且希望在迭代之间保留这些副作用,那么您就不能依赖于此。这取决于您。如果缓存了rdd
,则分区将被计算一次并在迭代过程中保留,除非出现某种故障,并且任务被重新调度到另一个工作进程上。否则,将为每个迭代重新计算它。在这种情况下,答案取决于rdd
的血统。如果不涉及洗牌,或者使用确定性分区和排序,那么答案是肯定的。否则,您不可能在每次迭代中看到相同的内容
如果您关心性能,那么缓存就足够了。如果您想在
mapPartitions
中执行一些副作用,并且希望在迭代之间保留这些副作用,那么您就不能依赖这些副作用。这是对spark RDD中缓存工作方式的一个很好的描述。这是对spark RDD中缓存工作方式的一个很好的描述。