rdd1.join(rdd2)
は、rdd1
およびrdd2
同じパーティショナーがありますか?
いいえ。2つのRDDに同じパーティショナーがある場合、join
はシャッフルを引き起こしません。これは 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)
}
}
}
ただし、シャッフルがなくても、ノード間でデータを移動する必要がないという意味ではありません。 2つのRDDが同じパーティショナーを持っている(共同パーティション化されている)が、対応するパーティションが異なるノードにある(同じ場所に配置されていない)可能性があります。
この状況は、シャッフルするよりも優れていますが、覚えておく必要があります。コロケーションはパフォーマンスを向上させることができますが、保証することは困難です。