SparkSQL開窗函數(shù)分析使用示例
開窗函數(shù)能在每行的最后一行都顯示聚合函數(shù)的結果,所以聚合函數(shù)可以用作開窗函數(shù)
聚合函數(shù)和開窗函數(shù)
聚合函數(shù)是將多行變成一行,如果要顯示其他列,必須將列加入group by
開窗函數(shù)是將一行變成多行,將所有的信息顯示出來
開窗函數(shù)
聚合開窗函數(shù)
聚合函數(shù) over(partition by子句)
over關鍵字將聚合函數(shù)當作聚合開窗函數(shù)
SQL標準允許所有的聚合函數(shù)用作聚合開窗函數(shù)
示例:
// spark.sql("select id, name, age, count(name) from person").show 報錯 spark.sql("select id, name, age, count(name)over() sum from person").show /* * +---+----+---+---+ | id|name|age|sum| +---+----+---+---+ | 1| jx| 20| 6| | 2| zx| 21| 6| | 3| wz| 33| 6| | 4| qw| 11| 6| | 5| aa| 22| 6| | 6| aq| 45| 6| +---+----+---+---+ * * */
over后面的括號還可以改變聚合函數(shù)的窗口范圍
如果over后面的括號為空,則開窗函數(shù)會對所有行進行聚合運算
over后面的括號里可以用partition by 來定義行的分區(qū)來進行聚合運算
partition by進行分區(qū)之后,計算當前分區(qū)的聚合計算的結果
spark.sql("select id, name, age, area_id, count(name)over(partition by area_id) sum from person").show /* +---+----+---+-------+---+ | id|name|age|area_id|sum| +---+----+---+-------+---+ | 1| jx| 20| 1| 3| | 2| zx| 21| 1| 3| | 3| wz| 33| 1| 3| | 5| aa| 22| 3| 2| | 6| aq| 45| 3| 2| | 4| qw| 11| 2| 1| +---+----+---+-------+---+ * * */
排序開窗函數(shù)
ROW_NUMBER順序排序
row_number() over(order by score)
排序開窗函數(shù)中使用partition by 需要放置在order by之前
實例
spark.sql("select id, name, age, area_id, row_number() over(order by age) rank from person").show spark.sql("select id, name, age, area_id, row_number() over(partition by area_id order by age) rank from person").show /* +---+----+---+-------+----+ | id|name|age|area_id|rank| +---+----+---+-------+----+ | 4| qw| 11| 2| 1| | 1| jx| 20| 1| 2| | 2| zx| 21| 1| 3| | 5| aa| 22| 3| 4| | 3| wz| 33| 1| 5| | 6| aq| 45| 3| 6| +---+----+---+-------+----+ +---+----+---+-------+----+ | id|name|age|area_id|rank| +---+----+---+-------+----+ | 1| jx| 20| 1| 1| | 2| zx| 21| 1| 2| | 3| wz| 33| 1| 3| | 5| aa| 22| 3| 1| | 6| aq| 45| 3| 2| | 4| qw| 11| 2| 1| +---+----+---+-------+----+ * * */
RANK跳躍排序
rank() over(order by)
使用該函數(shù)排序求出來的結果可以并列
示例
spark.sql("select id, name, age, area_id, rank() over(order by age) rank from person").show spark.sql("select id, name, age, area_id, rank() over(partition by area_id order by age) rank from person").show /* +---+----+---+-------+----+ | id|name|age|area_id|rank| +---+----+---+-------+----+ | 4| qw| 10| 2| 1| | 1| jx| 20| 1| 2| | 2| zx| 20| 1| 2| | 5| aa| 22| 3| 4| | 7| qq| 22| 3| 4| | 3| wz| 33| 1| 6| | 6| aq| 45| 3| 7| +---+----+---+-------+----+ +---+----+---+-------+----+ | id|name|age|area_id|rank| +---+----+---+-------+----+ | 1| jx| 20| 1| 1| | 2| zx| 20| 1| 1| | 3| wz| 33| 1| 3| | 5| aa| 22| 3| 1| | 7| qq| 22| 3| 1| | 6| aq| 45| 3| 3| | 4| qw| 10| 2| 1| +---+----+---+-------+----+ * * */
DENSE_RANK連續(xù)排序
dense_rank() over(order by )
使用該函數(shù),并列排名之后的排序+1
示例
spark.sql("select id, name, age, area_id, dense_rank() over(order by age) rank from person").show spark.sql("select id, name, age, area_id, dense_rank() over(partition by area_id order by age) rank from person").show /* +---+----+---+-------+----+ | id|name|age|area_id|rank| +---+----+---+-------+----+ | 4| qw| 10| 2| 1| | 1| jx| 20| 1| 2| | 2| zx| 20| 1| 2| | 5| aa| 22| 3| 3| | 7| qq| 22| 3| 3| | 3| wz| 33| 1| 4| | 6| aq| 45| 3| 5| +---+----+---+-------+----+ +---+----+---+-------+----+ | id|name|age|area_id|rank| +---+----+---+-------+----+ | 1| jx| 20| 1| 1| | 2| zx| 20| 1| 1| | 3| wz| 33| 1| 2| | 5| aa| 22| 3| 1| | 7| qq| 22| 3| 1| | 6| aq| 45| 3| 2| | 4| qw| 10| 2| 1| +---+----+---+-------+----+ * * */
NTILE分組排序
ntile(6) over(order by) // 表示分成六個組,顯示每個組的序號
spark.sql("select id, name, age, area_id, ntile(4) over(order by age) rank from person").show spark.sql("select id, name, age, area_id, ntile(4) over(partition by area_id order by age) rank from person").show /* +---+----+---+-------+----+ | id|name|age|area_id|rank| +---+----+---+-------+----+ | 4| qw| 10| 2| 1| | 1| jx| 20| 1| 1| | 2| zx| 20| 1| 2| | 5| aa| 22| 3| 2| | 7| qq| 22| 3| 3| | 3| wz| 33| 1| 3| | 6| aq| 45| 3| 4| +---+----+---+-------+----+ +---+----+---+-------+----+ | id|name|age|area_id|rank| +---+----+---+-------+----+ | 1| jx| 20| 1| 1| | 2| zx| 20| 1| 2| | 3| wz| 33| 1| 3| | 5| aa| 22| 3| 1| | 7| qq| 22| 3| 2| | 6| aq| 45| 3| 3| | 4| qw| 10| 2| 1| +---+----+---+-------+----+ * * */
到此這篇關于SparkSQL開窗函數(shù)分析使用示例的文章就介紹到這了,更多相關SparkSQL開窗函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring中@PropertySource的使用方法和運行原理詳解
這篇文章主要介紹了Spring中@PropertySource的使用方法和運行原理詳解,PropertySource注解可以方便和靈活的向Spring的環(huán)境容器(org.springframework.core.env.Environment?Environment)中注入一些屬性,這些屬性可以在Bean中使用,需要的朋友可以參考下2023-11-11

springboot 設置局域網(wǎng)訪問的實現(xiàn)步驟