根据最大double值在RDD [String,String,Double]中查找唯一记录

时间:2018-07-20 10:57:54

标签: scala apache-spark

我有一个RDD [(String,String,Double)]为:-

(9W+air-jet-airways-v1,IN,8.0)
(9W+air-jet-airways-v1,ID,7.0)
(9W+air-jet-airways-v1,US,7.0)
(6E+air-indigo-v1,IN,29.0)
(UA+air-united-airlines-v1,US,29.0)
(HO+air-juneyao-airlines-v1,CN,3.0)
(TL+air-airnorth-v1,AU,3.0)
(W3+air-arik-air-v1,NG,7.0)
(CA+air-air-china-v1,CN,6.0)
(6E+air-indigo-v1,NI,3.0)
(CA+air-air-china-v1,CA,2.0)
(LH+air-lufthansa-v1,DE,1.0)
(6E+air-indigo-v1,LK,1.0)

现在我需要的输出是:-

(9W+air-jet-airways-v1,IN)
(6E+air-indigo-v1,IN)
(LH+air-lufthansa-v1,DE)
(CA+air-air-china-v1,CN)
(UA+air-united-airlines-v1,US)

(与顺序无关)表示第一个字符串作为键,并基于第二个双精度字符串的最大值。 我尝试过类似的东西:-

rec.groupBy(x => (x._1)).map{case(k,v) => k}.map(x=> x._2).reduceByKey(_+_)

但似乎我在犯错(这种情况下的明显错误是可以比较的逻辑) 由于我对scala和spark并不陌生,因此不胜感激。

1 个答案:

答案 0 :(得分:0)

找到输出。不知道这是否最好,但我尝试过的是:-

rec.groupBy(x=>x._1).map{
 case (k,v) =>
 val value = v.toList.sortWith(_._3 > _._3).head
 (value._1, value._2)
}

我敢肯定还会有一些更简单的方法,但是这次对我有用。