• Window 窗口函数 (Spark Sql)


    目录

    前言

    首先先上语法代码(基础语法)

    排序函数 

     案例实战

    1.题目要求:求出id中成绩最高的数据

     题目解析:根据这个题目要求我们可以将id进行排序然后用Window窗口函数进行排名取第一名即可

    总结


    前言

    Spark SQL 中,Window 函数是一种用于在查询结果集中执行聚合、排序和分析操作的强大工具。它允许你在查询中创建一个窗口,然后对窗口内的数据进行聚合计算。

    首先先上语法代码(基础语法)

    1. import org.apache.spark.sql.expressions.Window
    2. import org.apache.spark.sql.functions._
    3. //1. 创建一个 WindowSpec 对象,指定窗口的分区和排序方式
    4. val windowSpec = Window.partitionBy("id").orderBy(desc("sales"))
    5. //2. 使用 Window 函数计算每个类别的销售额排名
    6. val result = df.withColumn("rank", rank().over(windowSpec))
    7. result.show()

    语句解析:

    1.Window.partitionBy("id").orderBy(desc("sales")

    partitionBy()   分组函数(可以理解为groupBy函数)

    orderBy()    排序函数函数 (desc|asc)

    对字段“id”进行分组,然后分完组后对“sales”字段进行降序排序

    2.val result = df.withColumn("rank", rank().over(windowSpec))

    rank()  排序函数

    over()  调用窗口函数

    添加rank列,将排序后的值添加进去

    排序函数 

    最后,使用 `withColumn` 方法将计算出的排名添加为新的列,并通过 `show()` 方法展示结果。

     案例实战

    先初始化一个sparkSql 对象 和 初始化数据

    1. object Main2 {
    2. def main(args: Array[String]): Unit = {
    3. var con = new SparkConf().setMaster("local[*]").setAppName("main")
    4. val sc = new SparkSession.Builder()
    5. .config(con)
    6. .enableHiveSupport()
    7. .getOrCreate()
    8. // 模拟数据
    9. // 创建数据框
    10. val data = List(
    11. (1, "张三", 18, 85.5),
    12. (1, "李四", 19, 90.0),
    13. (3, "王五", 20, 88.0),
    14. (3, "赵六", 21, 92.5),
    15. (1, "陈七", 22, 89.0),
    16. (3, "杨八", 23, 91.5),
    17. (4, "孙九", 24, 90.0),
    18. (6, "周十", 25, 88.5),
    19. (6, "吴十一", 26, 93.0),
    20. (6, "郑十二", 27, 87.5)
    21. )
    22. // 将数据转换为DataFrame
    23. val df = sc.createDataFrame(data)
    24. val frame = df.toDF("id", "name", "age", "level") //添加列名
    25. frame.show()
    26. }
    27. }

    1.题目要求:求出id中成绩最高的数据

     题目解析:根据这个题目要求我们可以将id进行排序然后用Window窗口函数进行排名取第一名即可

    1. // 1.定义窗口函数 (根据id列进行分组,然后level进行排序)
    2. val w1 = Window.partitionBy("id").orderBy(col("level").desc)
    3. // 2.利用窗口函数的排名进行排名
    4. val frame1 = frame.withColumn("rank", rank().over(w1)) //利用窗口函数的排名
    5. frame1.where(col("rank")=== 1).show() //过滤出排名第一的数据

     最后过滤出排名是第一的数据

    语句分析:

    1.val w1 = Window.partitionBy("id").orderBy(col("level").desc)

    首先是对"id"列进行了分组然后对“level”列进行了降序排序

    2.frame.withColumn("rank", rank().over(w1)) 

    然后添加了rank列,并插入排名数值

    注意事项:

    rank(): 可以是其他的函数代替起到不一样的效果

    结果展示: 

    总结

    窗口函数首先先进行分组(partition by),在进行排序(order by)。再用序号函数用over方法进行调用返回排名序号

  • 相关阅读:
    Qt5开发从入门到精通——第六篇二节( 图像与图片——基础图形的绘制 )
    西宾得到语音下载工具(dedaodown
    eyb:SpringSecurity的使用(四)
    试剂盒和示踪剂—艾美捷FLIVO探针活体凋亡检测分析
    SubDAO与Moonbeam网络集成
    玩转Mysql系列 - 第22篇:mysql索引原理详解
    脑肽载体Angiopep-2、906480-05-5、TFFYGGSRGKRNNFKTEEY
    【ZLM】花屏现象记录
    C++ Primer学习笔记-----附录:标准库
    常见html+css面试题
  • 原文地址:https://blog.csdn.net/m0_69097184/article/details/133862928