我有一个RDD,我想找到所有具有最大值的键。 所以,如果我有
( ((A), 5), ((B), 4), ((C), 5)) )
然后我想返回
( ((A), 5), ((C), 5)) )
编辑; MaxBy只发出一个键,所以我认为这不会起作用。
我试过了
newRDD = oldRDD.sortBy(._2, false).filter{._2 == _.first}¨
和
newRDD = oldRDD.filter{_._2 == _.maxBy}
我知道_.first和_.MaxBy不会工作,但应该从旧的RDD获得maxValue。我尝试的每个解决方案中的问题是我无法在过滤器内部使用maxValue。我也相信我试过的第二个“解决方案”比第一个快得多,因为sortBy并不是真的有必要。
答案 0 :(得分:1)
这是一个答案。逻辑非常简单:
val rdd = sc.parallelize(Seq(("a", 5), ("b", 4), ("c", 5)))
// first get maximum value
val maxVal = rdd.values.max
// now filter to those elements with value==max value
val rddMax = rdd.filter { case (_, v) => v == maxVal }
rddMax.take(10)
答案 1 :(得分:0)
我不熟悉spark / RDD。在简单的Scala中,我会这样做:
scala> val max = ds.maxBy (_._2)._2
max: Int = 5
scala> ds.filter (_._2 == max)
res207: List[(String, Int)] = List((A,5), (C,5))
设置是:
scala> val (a, b, c) = ("A", "B", "C")
a: String = A
b: String = B
c: String = C
scala> val ds = List ( ((a), 5), ((b), 4), ((c), 5))
ds: List[(String, Int)] = List((A,5), (B,4), (C,5))