spark中各窗口函数对于窗口的要求
窗口参数:
class WindowSpec private[sql](
partitionSpec: Seq[Expression],
orderSpec: Seq[SortOrder],
frame: WindowFrame)
1、Aggregate Functions: 聚合函数,比如:sum(...)、 max(...)、min(...)、avg(...)等.
对于窗口要求无所限制,但窗口参数具备相应的默认值:
partitionSpec
默认是 SinglePartition
(单个分区)
orderSpec
默认不排序
frame
- 当窗口缺少
orderSpec
时,默认specifiedwindowframe(RowFrame, unboundedpreceding$(), unboundedfollowing$())
- 当窗口具备
orderSpec
时,默认specifiedwindowframe(RangeFrame, unboundedpreceding$(), currentrow$())
2、Sort Functions: 排序函数 , 比如:rank()、row_number()、dense_rank() 等.
要求运行的窗口必须具备 orderSpec
,
并且 frame
必须是 specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())
frame
可以不指定,让程序默认生成
partitionSpec
默认是 SinglePartition
3、Analytics Functions: 统计和分析函数,比如:lead(...)、lag(...) 等.
要求运行的窗口必须具备 orderSpec
,
frame
要求使用 RowFrame
,
preceding
和 following
会根据 函数的offset
参数 动态变化,
例如:
lead($"id", offset = 1) over spec.orderBy("id")
// specifiedwindowframe(RowFrame, 1, 1)
lead($"id", offset = 3) over spec.orderBy("id")
// specifiedwindowframe(RowFrame, 3, 3)
lag($"id", offset = 2) over spec.orderBy("id")
// specifiedwindowframe(RowFrame, -2, -2)
lag($"id", offset = 4) over spec.orderBy("id")
// specifiedwindowframe(RowFrame, -4, -4)
frame
可以不指定,让程序默认生成
partitionSpec
默认是 SinglePartition
不难看出,lead 和 lag 函数就是通过 frame
限制窗口的大小和位置来实现的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步