Scala 在一个文件中对spark RDD进行排序和排名
我有一个spark RDD,如下所示Scala 在一个文件中对spark RDD进行排序和排名,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有一个spark RDD,如下所示 (maths,60) (english,65) (english,77) (maths,23) (maths,50) 我需要对给定的RDD进行排序和排序,如下所示 (数学,23,1) (数学,50,2) (数学,50,3) (英文,65,1) (英文,77,2) 我知道使用数据帧可以很容易地做到这一点,但我需要Spark rdd代码来获得解决方案,请建议使用Spark rdd函数(所谓的转换)像groupByKeyflatMap和ScalaList像sor
(maths,60)
(english,65)
(english,77)
(maths,23)
(maths,50)
我需要对给定的RDD进行排序和排序,如下所示
(数学,23,1)
(数学,50,2)
(数学,50,3)
(英文,65,1)
(英文,77,2)
我知道使用数据帧可以很容易地做到这一点,但我需要Spark rdd代码来获得解决方案,请建议使用Spark rdd函数(所谓的转换)像
groupByKey
flatMap
和ScalaList
像sorted
这样的函数应该有助于实现它
val rdd = spark.sparkContext.parallelize(
Seq(("maths",60),
("english",65),
("english",77),
("maths",23),
("maths",50)))
val result = rdd.groupByKey().flatMap(group => {
group._2.toList
.sorted.toList // sort marks
.zipWithIndex // add the position/rank
.map {
case(marks, index) => (group._1, marks, index + 1)
}
})
result.collect
// Array((english,65,1), (english,77,2), (maths,23,1), (maths,50,2), (maths,60,3))
另一个rdd解决方案:
val df = Seq(("maths",60),("english",65),("english",77),("maths",23),("maths",50)).toDF("subject","marks")
val rdd1 = df.rdd
rdd1.groupBy( x=> x(0))
.map( x=>
{
val p = x._2.toList.map(a=>a(1)).map(_.toString.toInt).sortWith((a1,a2)=> a1 < a2 ).zipWithIndex.map(b=>(b._1,b._2+1))
(x._1,p)
}
)
.flatMap( x => x._2.map((x._1,_)))
.collect.foreach(println)
@戴维德:很高兴这有帮助!!考虑将答案标记为“接受”,这样社区就可以知道问题已经得到解答。
(english,(65,1))
(english,(77,2))
(maths,(23,1))
(maths,(50,2))
(maths,(60,3))