Spark分组排序TopN

数据源

# f://data.txt
# className, studentName, score
c1	a	85
c2	b	77
c3	c	88
c1	d	22
c1	e	66
c3	f	95
c3	g	54
c2	h	91
c2	i	66
c1	j	54
c1	k	65
c2	l	41
c4	m	65

目标

对班级进行分组,对成绩求topN

解决方法

Spark Core

val classStudentScore = spark.sparkContext.textFile("f://data.txt")
      .map(x=>{
        val splits = x.split("\t")
        (splits(0), (splits(1), splits(2).toInt))
      })
      .groupByKey()
      .map(x=>{
        val className = x._1
        val nameScores = x._2.toArray.sortBy(_._2).reverse.take(3)
        (className, nameScores)
      })
      .foreach(x=>{
        println(x._1)
        x._2.foreach(println)
      })

Spark SQL

    val classStudentScoreRDD = spark.read.text("f://data.txt").rdd
      .map(x => {
        val splits = x.getString(0).split("\t")
        Row(splits(0), splits(1), splits(2).toInt)
      })

    val classStudentScoreDF = spark.createDataFrame(classStudentScoreRDD, new StructType(
      Array(
        StructField("className", StringType, true),
        StructField("studentName", StringType, true),
        StructField("score", IntegerType, true)
      )
    ))

    classStudentScoreDF
      .withColumn("rank",
        row_number()
          over
          partitionBy(col("className"))
            .orderBy(col("score").desc))
      .filter(col("rank").<=(3))
      .show()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值