Scala 查找Spark RDD中的最大值

Scala 查找Spark RDD中的最大值,scala,apache-spark,Scala,Apache Spark,从下面的例子中,我如何获得具有最高值的元组 Array[(String, Int)] = Array((a,30),(b,50),(c,20)) 在本例中,我想要的结果是(b,50)如果元素始终是两个元素的元组,您可以简单地: Array((a,30),(b,50),(c,20)).maxBy(_._2) 按照。中的规定,您可以使用reduce(): 如果您是spark的新手,我应该告诉您,您必须尽可能多地使用Dataframes,它们与RDDs相比有很多优势,使用Dataframes,您可

从下面的例子中,我如何获得具有最高值的元组

Array[(String, Int)] = Array((a,30),(b,50),(c,20))

在本例中,我想要的结果是
(b,50)

如果元素始终是两个元素的元组,您可以简单地:

Array((a,30),(b,50),(c,20)).maxBy(_._2)
按照。

中的规定,您可以使用
reduce()


如果您是spark的新手,我应该告诉您,您必须尽可能多地使用
Dataframe
s,它们与
RDD
s相比有很多优势,使用
Dataframe
s,您可以获得如下最大值:

import spark.implicits._
import org.apache.spark.sql.functions.max
val df = Seq(("a",30),("b",50),("c",20)).toDF("x", "y")
val x = df.sort($"y".desc).first()
免责声明:正如@Mandy007在评论中指出的,该解决方案的计算成本更高,因为它必须订购

这应该管用,至少对我管用。希望这对您有所帮助。

reduce()
为我返回了错误的结果。还有其他一些选择:

val maxTemp2 = rdd.max()(Ordering[Int].on(x=>x._2))
val maxTemp3 = rdd.sortBy[Int](x=>x._2).take(1)(0)
数据

val rdd = sc.parallelize(Array(("a",30),("b",50),("c",20)))
val rdd = sc.parallelize(Array(("a",30),("b",50),("c",20)))
rdd.reduceByKey((a,b)=>a+b).collect.maxBy(u.2)


我们可以像这样在collect上使用maxBy

除了maxBy还有其他方法吗?使用
maxBy
有什么问题?这看起来是最简单、最直接的方法。当我使用maxBy时,会出现以下错误:
错误:value maxBy不是org.apache.spark.rdd.rdd[(String,int)]的成员。
抱歉。我是新手,所以我还在学习诀窍。如何在
RDD上执行相同的操作
?我不知道,如果说得很清楚的话,我也不会尝试回答:)如果你想充分利用它,那么我建议你读一读你在展示
数组[(String,Int)]
示例时询问如何在RDD中找到最大值。我缺少Spark的RDDAPI和Scala之间的联系。输入数组有多大?如果要转换为dataframe,最好使用聚合函数
max()
。问题是它只返回一列的值,我们需要整行。这种解决方案的计算成本更高,因为它必须ordered@Mandy007你说得对。我会更新我的答案accordingly@Mandy007我真的认为那是不对的。我相信数据帧具有查询优化功能,如果您进行排序,但只请求几行,那么它可以使用线性时间算法来查找那些最大值。为了找到答案,我在我的机器上测试了它;给你。当您请求更多的行时,订购会变得更昂贵。
val rdd = sc.parallelize(Array(("a",30),("b",50),("c",20)))