【问题标题】:sort and rank in spark RDD in one file在一个文件中对 spark RDD 进行排序和排名
【发布时间】:2018-11-20 06:21:48
【问题描述】:

我有一个如下的 spark RDD

(maths,60)
(english,65)
(english,77)
(maths,23)
(maths,50)

我需要对给定的 RDD 进行排序和排序,如下所示 (数学,23,1) (数学,50,2) (数学,50,3) (英语,65,1) (英,77,2)

我知道这可以使用 Data Frame 轻松完成,但我需要 Spark rdd 代码来获得解决方案,请建议

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    Spark RDD 函数(所谓的转换)如 groupByKey flatMapScala 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))
    

    Databricks notebook

    【讨论】:

    • @devD:很高兴有帮助!考虑将答案标记为已接受,以便社区可以知道该问题已得到解答。
    【解决方案2】:

    另一个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))
    

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 2015-08-23
      相关资源
      最近更新 更多