rdd1.join(rdd2)
provoquera-t-il un brassage si rdd1
et rdd2
avez le même partitionneur?
Non. Si deux RDD ont le même partitionneur, le join
ne provoquera pas de mélange. Vous pouvez le voir dans CoGroupedRDD.scala
:
override def getDependencies: Seq[Dependency[_]] = {
rdds.map { rdd: RDD[_ <: Product2[K, _]] =>
if (rdd.partitioner == Some(part)) {
logDebug("Adding one-to-one dependency with " + rdd)
new OneToOneDependency(rdd)
} else {
logDebug("Adding shuffle dependency with " + rdd)
new ShuffleDependency[K, Any, CoGroupCombiner](rdd, part, serializer)
}
}
}
Notez cependant que l'absence d'un shuffle ne signifie pas qu'aucune donnée ne devra être déplacée entre les nœuds. Il est possible pour deux RDD d'avoir le même partitionneur (être co-partitionné) tout en ayant les partitions correspondantes situées sur des nœuds différents (ne pas être co-localisés).
Cette situation est toujours meilleure que de faire un shuffle, mais c'est quelque chose à garder à l'esprit. La colocalisation peut améliorer les performances, mais est difficile à garantir.