私はSparkのソースコードを調べました。
def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U] = withScope {
val cleanF = sc.clean(f)
new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.flatMap(cleanF))
}
と
private[spark] class MapPartitionsRDD[U: ClassTag, T: ClassTag](
var prev: RDD[T],
f: (TaskContext, Int, Iterator[T]) => Iterator[U], // (TaskContext, partition index, iterator)
preservesPartitioning: Boolean = false)
extends RDD[U](prev) {
override val partitioner = if (preservesPartitioning) firstParent[T].partitioner else None
override def getPartitions: Array[Partition] = firstParent[T].partitions
override def compute(split: Partition, context: TaskContext): Iterator[U] =
f(context, split.index, firstParent[T].iterator(split, context))
override def clearDependencies() {
super.clearDependencies()
prev = null
}
}
は、データの順序はそのまま残り必要がありますが、いくつかの再分割は行われてもよいし、これは、または(あなたが何をしているかに応じて)あなたを気にしない場合があります。
@AlbertoBonsantoこれは当てはまりません。順序によっては、通常は良いアイデアではありませんが、フラットマップはデータをシャッフルしません。 – zero323
@AlbertoBonsanto RDDは配信されているにもかかわらず注文が確定しています。 –
それでは、私の元のrddを見てみましょう:rdd([1,2]、[3,4]、[5,6]])、私の変換を適用した後、Rdd(1,2,3 、4,5,6)。あれは正しいですか? –