当前位置:   article > 正文

Window 窗口函数 (Spark Sql)_sparksql window

sparksql window

目录

前言

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

排序函数 

 案例实战

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方法进行调用返回排名序号

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号