2016-06-24 4 views
1

私はRDD[Array[Array[Float]]を持つSparkアプリケーションに取り組んでおり、RDD[Float]に変換したいと思います。私は私のためにこの作業を行うには、次のコードを持っている:flatMapは注文をそのまま維持しますか?

val values = predictions.flatMap { x => (for(y <- 0 to x.length - 1) yield x(y)).map(c => c(0)) }  

私は要素の順序がflatMapかを使用した後に変更されたかどうかわかりませんが?もしそうなら、他の解決策がありますか?

+1

@AlbertoBonsantoこれは当てはまりません。順序によっては、通常は良いアイデアではありませんが、フラットマップはデータをシャッフルしません。 – zero323

+0

@AlbertoBonsanto RDDは配信されているにもかかわらず注文が確定しています。 –

+0

それでは、私の元のrddを見てみましょう:rdd([1,2]、[3,4]、[5,6]])、私の変換を適用した後、Rdd(1,2,3 、4,5,6)。あれは正しいですか? –

答えて

7

はい、flatMapはそのままです。 do mapfilterなど

+0

それでは、私の元のrddの外観は、rdd([[1,2]、[3,4]、[5,6]])になります。 、4,5,6)。あれは正しいですか? –

1

私は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 
    } 
} 

は、データの順序はそのまま残り必要がありますが、いくつかの再分割は行われてもよいし、これは、または(あなたが何をしているかに応じて)あなたを気にしない場合があります。

関連する問題