Spark:按键获得前N名

mic*_*mus 12 scala apache-spark

假设我有一个PairRDD(显然现实生活中的数据更多,假设有数百万条记录):

val scores = sc.parallelize(Array(
      ("a", 1),  
      ("a", 2), 
      ("a", 3), 
      ("b", 3), 
      ("b", 1), 
      ("a", 4),  
      ("b", 4), 
      ("b", 2)
))
Run Code Online (Sandbox Code Playgroud)

生成具有每个键前2个分数的RDD的最有效方法是什么?

val top2ByKey = ...
res3: Array[(String, Int)] = Array((a,4), (a,3), (b,4), (b,3))
Run Code Online (Sandbox Code Playgroud)

aba*_*rek 11

我认为这应该是非常有效的:

根据OP评论编辑:

scores.mapValues(p => (p, p)).reduceByKey((u, v) => {
  val values = List(u._1, u._2, v._1, v._2).sorted(Ordering[Int].reverse).distinct
  if (values.size > 1) (values(0), values(1))
  else (values(0), values(0))
}).collect().foreach(println)
Run Code Online (Sandbox Code Playgroud)


jbo*_*chi 11

从版本1.4开始,有一种使用MLLib执行此操作的内置方法:https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/mllib/rdd /MLPairRDDFunctions.scala

import org.apache.spark.mllib.rdd.MLPairRDDFunctions.fromPairRDD
scores.topByKey(2)
Run Code Online (Sandbox Code Playgroud)