Scala spark中的平面图是否会导致混乱?

Scala spark中的平面图是否会导致混乱?,scala,apache-spark,bigdata,Scala,Apache Spark,Bigdata,spark中的flatMap的行为是否与map函数类似,因此不会导致洗牌,还是会触发洗牌。我怀疑这确实会导致洗牌。有人能确认一下吗?禁止洗牌。以下是这两个功能的来源: /** * Return a new RDD by applying a function to all elements of this RDD. */ def map[U: ClassTag](f: T => U): RDD[U] = withScope { val cleanF = sc.clean(f)

spark中的flatMap的行为是否与map函数类似,因此不会导致洗牌,还是会触发洗牌。我怀疑这确实会导致洗牌。有人能确认一下吗?

禁止洗牌。以下是这两个功能的来源:

/**
 * Return a new RDD by applying a function to all elements of this RDD.
 */
def map[U: ClassTag](f: T => U): RDD[U] = withScope {
  val cleanF = sc.clean(f)
  new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
}

/**
 *  Return a new RDD by first applying a function to all elements of this
 *  RDD, and then flattening the results.
 */
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))
}

如您所见,
RDD.flatMap
只调用Scala迭代器上表示分区的
flatMap

没有使用map或flatMap进行混洗。导致洗牌的操作有:

  • 重新分区操作:
    • 重新分配:
    • 合并:
  • 按键操作(计数除外):
    • GroupByKey:
    • ReduceByKey:
  • 加入操作:
    • 协同组:
    • 加入:
虽然每个新洗牌数据分区中的元素集是确定的,分区本身的顺序也是确定的,但这些元素的顺序不是确定的。如果希望在洗牌后获得可预测的有序数据,则可以使用:

  • mapPartitions,以使用对每个分区进行排序,例如,.sorted
  • repartitionAndSortWithinPartitions可在重新分区的同时对分区进行有效排序
  • sortBy创建一个全局排序的RDD

此处的更多信息:

flatMap在某些情况下可能会导致无序写入。比如,如果在同一个分区中生成多个元素,而该元素无法放入同一分区,那么它会将这些元素写入不同的分区

如以下示例所示:

val rdd = RDD[BigObject]

rdd.flatMap{ bigObject => 
    val rangList: List[Int] = List.range(1, 1000)
    rangList.map( num => (num, bigObject))
}

上面的代码将在同一个分区上运行,但由于我们创建了太多的BigObject实例,它会将这些对象写入单独的分区,这将导致无序写入

请看答案需要更正-Coalesce不会产生无序。这是一个狭义的rdd依赖项。有人能验证这是否正确,如果没有,请将其标记为不正确吗?否则我们不会有最大分区大小错误。我想他/她的意思是会发生“重新分区”。所以,不,flatMap不会导致洗牌。