flatMap是否保持订单完整?

时间:2016-06-24 01:54:15

标签: scala apache-spark

我正在开发一个Spark应用程序,其中我有RDD[Array[Array[Float]],我想将其转换为RDD[Float]。我有以下代码为我执行此任务:

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

但是我不知道在使用flatMap之后是否更改了元素的顺序?如果是这样,是否有任何其他解决方案保持元素的顺序完整?

2 个答案:

答案 0 :(得分:7)

是的,flatMap保持订单不变。 mapfilter

也是如此

答案 1 :(得分: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
  }
}

数据的顺序应保持不变,但可能会进行一些重新分区,这可能会或可能不会打扰您(取决于您正在做什么)。