spark中的flatMap是否与map函数一样,因此不会导致混乱,或者是否会触发shuffle。我怀疑它确实导致了改组。有人可以证实吗?
答案 0 :(得分:7)
map或flatMap都没有改组。导致随机播放的操作是:
虽然新洗牌数据的每个分区中的元素集将是确定性的,并且分区本身的排序也是如此,但这些元素的排序不是。如果在随机播放之后需要可预测的有序数据,则可以使用:
此处有更多信息:http://spark.apache.org/docs/latest/programming-guide.html#shuffle-operations
答案 1 :(得分:4)
没有洗牌。以下是两种功能的来源:
/**
* 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
。
答案 2 :(得分:0)
flatMap在某些情况下可能会导致随机写入。例如,如果您要在同一个分区中生成多个元素,而该元素不能容纳在同一个分区中,那么它将把这些元素写入另一个分区。
如以下示例所示:
val rdd = RDD[BigObject]
rdd.flatMap{ bigObject =>
val rangList: List[Int] = List.range(1, 1000)
rangList.map( num => (num, bigObject))
}
以上代码将在同一分区上运行,但是由于我们创建了太多的BigObject实例,它将把这些对象写入单独的分区,这将导致随机写入