2017-05-18 136 views
1

從以下內容可以得出具有最高值的元組嗎?在Spark中查找最大值RDD

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

在這個例子中,結果我想會是(b,50)

+0

您正在詢問如何在使用Array [(String,Int)]'示例時在RDD中查找最大值。我錯過了Spark的RDD API和Scala之間的連接。輸入數組有多大? –

回答

3

你可以使用reduce()

val max_tuple = rdd.reduce((acc,value) => { 
    if(acc._2 < value._2) value else acc}) 
//max_tuple: (String, Int) = (b,50) 

數據

val rdd = sc.parallelize(Array(("a",30),("b",50),("c",20))) 
1

如果這些元素始終是兩個元素的元組你可以簡單地:

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

正如docs指定。

+0

除了maxBy之外,還有其他的方式嗎? – ZeroDarkThirty

+0

使用'maxBy'有什麼問題?它看起來是最簡單,最直接的方式。 – Dani

+0

當我使用maxBy時,出現以下錯誤: 'error:value maxBy不是org.apache.spark.rdd.RDD的成員[(String,int)]' – ZeroDarkThirty

1

如果你是新的火花,我要告訴你,你必須使用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() 

這應該起作用,它至少適用於我。希望對您有所幫助

+0

如果要轉換爲數據框,最好使用聚合函數max()。 – mtoto

+0

問題在於它只返回一列的值,我們希望整行 –

0

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))) 
0

rdd.reduceByKey((A,B)=> A + B).collect.maxBy(_._ 2)

我們可以使用maxBy來收集這樣的數據