SpqrkSQL的开窗函数

over()开窗函数其实就是根据指定字段分组再根据指定字段排序;
开窗函数也是自定义函数的一种,传入多个参数,传出多个参数;

package com

import org.apache.spark.sql.{Dataset, SparkSession}
import org.apache.spark.{SparkConf, SparkContext}

object demo101 {

  case class StudentScore(name:String,clazz:Int,score:Int)

  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setMaster("local[*]").setAppName(this.getClass.getName)

    val sc = new SparkContext(conf)

    val session = SparkSession.builder().config(conf).getOrCreate()

    val tuples: Array[(String, Int, Int)] = Array(
      ("a", 1, 88),
      ("b", 1, 78),
      ("c", 1, 95),
      ("d", 2, 74),
      ("e", 2, 92),
      ("f", 3, 99),
      ("g", 3, 99),
      ("h", 3, 45),
      ("i", 3, 53),
      ("j", 3, 78)
    )
    tuples

    import session.implicits._
    
    val ssDT: Dataset[StudentScore] = sc.makeRDD(tuples).map(a => StudentScore(a._1,a._2,a._3)).toDS()
//  创建临时表
    ssDT.createOrReplaceTempView("t_table")

//    session.sql("select * from t_table").show()
//  跳跃排序,两个第一名,后跟第三名
//    session.sql("select name,clazz,score,rank() over(partition by clazz order by score desc) rownum from t_table").show()
//  连续排序,两个第一名,后跟第二名
//    session.sql("select name,clazz,score,dense_rank() over(partition by clazz order by score desc) rownum from t_table").show()
//  连续排序,不存在并列第一名
//    session.sql("select name,clazz,score,row_number() over(partition by clazz order by score desc) rownum from t_table").show()
//  取前三名
//    session.sql("select * from (select name,clazz,score,rank() over(partition by clazz order by score desc) rownum from t_table) t1 where rownum <= 3").show()
//   session.sql("select * from (select name,clazz,score,dense_rank() over(partition by clazz order by score desc) rownum from t_table) t1 where rownum <= 3").show()
//    session.sql("select * from (select name,clazz,score,row_number() over(partition by clazz order by score desc) rownum from t_table) t1 where rownum <= 3").show()

  }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值