获取与Spark中的最大值关联的所有键

时间:2018-04-23 20:07:59

标签: scala apache-spark rdd

我有一个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并不是真的有必要。

2 个答案:

答案 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))