当我使用topByKey与不同的群集时,我有相同的时间来执行此代码,与我使用的从属数量无关。 RDD_distance大小介于10 ^ 8和10 ^ 12个单位之间。
parsedData.cache
for( ind <- 1 to maxIterForYstar ) {
var rdd_distance = rdd_temp.cartesian(parsedData).map{ case (x,y) => (x.get_id,(y.get_vector,-Vectors.sqdist(x.get_vector,y.get_vector))) }
var rdd_knn_bykey = rdd_distance.topByKey(k)(Ordering[(Double)].on(x=>x._2))
}
所以我的问题是知道topByKey是否可扩展,或者我的代码是否有问题。
答案 0 :(得分:1)
以下是topByKey
的实际代码:
@DeveloperApi
class MLPairRDDFunctions[K: ClassTag, V: ClassTag](self: RDD[(K, V)]) extends Serializable {
/**
* Returns the top k (largest) elements for each key from this RDD as defined by the specified
* implicit Ordering[T].
* If the number of elements for a certain key is less than k, all of them will be returned.
*
* @param num k, the number of top elements to return
* @param ord the implicit ordering for T
* @return an RDD that contains the top k values for each key
*/
def topByKey(num: Int)(implicit ord: Ordering[V]): RDD[(K, Array[V])] = {
self.aggregateByKey(new BoundedPriorityQueue[V](num)(ord))(
seqOp = (queue, item) => {
queue += item
},
combOp = (queue1, queue2) => {
queue1 ++= queue2
}
).mapValues(_.toArray.sorted(ord.reverse)) // This is an min-heap, so we reverse the order.
}
}
所以这是MLPairRDDFunctions
中唯一的方法。这是一个效率更高的groupByKey
,只保留了每个密钥的前k
个元素。
要考虑的几个问题,您可以通过研究Spark Web控制台来回答:
cartesian
产品实际上最贵吗?你能更有效地使用缓存吗?此外,看起来rdd_distance
可以在for
表达式之前计算一次,或者这只是一个简化的示例?