根据apache spark中的最大值从键值对返回键

时间:2016-04-19 18:11:09

标签: apache-spark rdd

我是apache spark的新手,我需要一些建议。我有一个带[String,Int]类型的RDD。 RDD值是这样的:

  • (" A,X",3)
  • (" A,Y",4)
  • (" A,Z",1)
  • (" B,Y",2)
  • (" C,W",5)
  • (" C,Y",2)
  • (" E,X",1)
  • (" E,Z",3)

我想要完成的是获得类似的RDD(String,String):

  • (" A"," y")//在包含A的关键字中,(A,y)具有最大值
  • (" B"," y")//在包含B的键中,(B,y)具有最大值
  • (" C"," w")//在包含C的密钥中,(C,w)具有最大值
  • (" E"," z")//包含E的密钥中,(E,z)具有最大值

我在flatMap中尝试了一个循环概念(通过使用计数器),但它不起作用。有一个简单的方法吗?

2 个答案:

答案 0 :(得分:2)

重新塑造并reduceByKey

val pattern = "^(.*?),(.*?)$".r

rdd
  // Split key into parts
  .flatMap{ case (pattern(x, y), z) => Some((x, (y, z))) }
  // Reduce by first part of the key
  .reduceByKey( (a, b) => if (a._2 > b._2) a else b )
  // Go back to the original shape
  .map { case (x, (y, z)) => (s"$x,$y", z) }

答案 1 :(得分:0)

您可以使用groupBy Key,然后使用maxBy函数获取输出

val data = Array(("A,x", 3),("A,y", 4),("A,z", 1),("B,y", 2),("C,w", 5),("C,y", 2),("E,x", 1),("E,z", 3))
val rdd = sc.makeRDD(data).map(i => { // Paralleling the sample data
val t = i._1.split(",")  // Splitting the String by , 
t(0) ->(t(1), i._2) // Transforming String,Int to String,(String,Int)
}).groupByKey().map(i => { // Performing a groupBy key 
(i._1, i._2.maxBy(_._2)._1) // returning the Max value by the Int being passed using the maxBy function 
})
rdd.foreach(println(_)) // Printing the output