【发布时间】:2016-07-24 16:07:15
【问题描述】:
spark 中的 flatMap 是否表现得像 map 函数,因此不会导致洗牌,还是会触发洗牌。我怀疑它确实会导致洗牌。有人可以确认吗?
【问题讨论】:
标签: scala apache-spark bigdata
spark 中的 flatMap 是否表现得像 map 函数,因此不会导致洗牌,还是会触发洗牌。我怀疑它确实会导致洗牌。有人可以确认吗?
【问题讨论】:
标签: scala apache-spark bigdata
flatMap 在某些情况下可能会导致随机写入。就像如果您在同一个分区中生成多个元素并且该元素不能放入同一个分区中,那么它会将这些元素写入不同的分区。
如下例所示:
val rdd = RDD[BigObject]
rdd.flatMap{ bigObject =>
val rangList: List[Int] = List.range(1, 1000)
rangList.map( num => (num, bigObject))
}
以上代码将在同一个分区上运行,但由于我们创建了太多 BigObject 实例,它会将这些对象写入单独的分区,这将导致随机写入
【讨论】:
地图或平面地图都没有洗牌。造成shuffle的操作有:
虽然新混洗数据的每个分区中的元素集合是确定性的,分区本身的顺序也是确定性的,但这些元素的顺序不是。如果希望在 shuffle 之后得到可预测的有序数据,那么可以使用:
更多信息在这里:http://spark.apache.org/docs/latest/programming-guide.html#shuffle-operations
【讨论】:
没有洗牌。以下是这两个函数的来源:
/**
* 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。
【讨论】: