Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在一个文件中对spark RDD进行排序和排名_Scala_Apache Spark_Rdd - Fatal编程技术网

Scala 在一个文件中对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

我有一个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函数(所谓的转换)像
groupByKey
flatMap
Scala
List
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))