Ответ 1
Скорее всего, вы уже изучили исходный код:
class OrderedRDDFunctions {
// <snip>
def sortByKey(ascending: Boolean = true, numPartitions: Int = self.partitions.size): RDD[P] = {
val part = new RangePartitioner(numPartitions, self, ascending)
val shuffled = new ShuffledRDD[K, V, P](self, part)
shuffled.mapPartitions(iter => {
val buf = iter.toArray
if (ascending) {
buf.sortWith((x, y) => x._1 < y._1).iterator
} else {
buf.sortWith((x, y) => x._1 > y._1).iterator
}
}, preservesPartitioning = true)
}
И, как вы говорите, данные целые должны пройти этап тасования - как видно из фрагмента.
Однако ваша озабоченность по поводу последующего вызова take (K) может быть не столь точным. Эта операция НЕ выполняет цикл по всем N элементам:
/**
* Take the first num elements of the RDD. It works by first scanning one partition, and use the
* results from that partition to estimate the number of additional partitions needed to satisfy
* the limit.
*/
def take(num: Int): Array[T] = {
Итак, казалось бы:
O (myRdd.take(K)) < O (myRdd.sortByKey()) ~ = O (myRdd.sortByKey.take(k)) (по меньшей мере, для малых K) O (myRdd.sortByKey(). Собирать()