【问题标题】:Getting all Keys associated with the max value in Spark获取与 Spark 中的最大值关联的所有键
【发布时间】:2018-04-23 20:07:59
【问题描述】:

我有一个 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 不起作用,但应该从 oldRDD 获取 maxValue。在我尝试的每个解决方案中,我的问题是我无法访问过滤器内的 maxValue。我也相信我尝试的第二个“解决方案”比第一个要快得多,因为 sortBy 并不是真正必要的。

【问题讨论】:

标签: scala apache-spark rdd


【解决方案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)

【讨论】:

    【解决方案2】:

    我不熟悉 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))
    

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多