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)
| 归档时间: |
|
| 查看次数: |
11831 次 |
| 最近记录: |