SparkSQL介紹並實現開窗函式

lhh學bg發表於2020-04-12

1.開窗函式

  • 聚合函式和開窗函式

聚合函式是將多行變成一行

開窗函式是將一行變成多行

  • 開窗函式分類

聚合開窗函式 : 聚合函式over 這裡的選擇可以是partition by 子句,但不可以是order by子句

排序開窗函式 : 排序函式over 這裡的選項可以是order by 子句,可以是 over(partition by 子句 order by 子句), 但不可以是 partition by 子句。

2.準備工作

//導包
import org.apache.spark.sql.SparkSession
//建立class 樣例類
case class Score(name: String, clazz: Int, score: Int)
//編寫程式碼
// 1.例項SparkSession
    val spark = SparkSession.builder().master("local[*]").appName("sql").getOrCreate()
//2.根據SparkSession獲取sparkContext 上下文物件
    val sc = spark.sparkContext
//3.匯入隱式類
    import spark.implicits._
//4.新增建立RDD並新增資料
    val scoreDF = sc.makeRDD(Array(
      Score("a1", 1, 80),
      Score("a2", 1, 78),
      Score("a3", 1, 95),
      Score("a4", 2, 74),
      Score("a5", 2, 92),
      Score("a6", 3, 99),
      Score("a7", 3, 99),
      Score("a8", 3, 45),
      Score("a9", 3, 55),
      Score("a10", 3, 78),
      Score("a11", 3, 100))).toDF("name", "clazz", "score")
//5.登錄檔
    scoreDF.createOrReplaceTempView("scores")
//6.資料展示
    scoreDF.show()

3.聚合開窗函式

 spark.sql("select * , count(name) over() name_count from scores").show()
// 按照班級進行分組
spark.sql("select * , count(name) over(partition by clazz) name_count from scores").show()

4.排序開窗函式

spark.sql("select * , row_number() over(order by score)  rank from scores").show()
//先分割槽然後在排序
 spark.sql("select * , row_number() over(partition by clazz order by score)  rank from scores").show()
// 跳躍排序
spark.sql("select * , rank() over(order by score)  rank from scores").show()
//先分割槽在跳躍排序
spark.sql("select * , rank() over(partition by clazz order by score)  rank from scores").show()
// 連續排序
spark.sql("select * , dense_rank() over( order by score)  rank from scores").show()
//先分割槽在連續排序
spark.sql("select * , dense_rank() over(partition by clazz order by score)  rank from scores").show()
// 分組將資料分為N個組
spark.sql("select * ,ntile(6) over( order by score)  rank from scores").show()

相關文章