Spark SQL应用系列:窗口函数

(TODO)

概述

使用窗口函数时,每条记录(record)都有一组记录与其相关联,我们把这组记录称为当前记录的数据帧(Frame)。窗口函数基于当前记录的数据帧,为其计算相应返回值。

窗口函数

哪些函数可用于窗口函数

Spark SQL支持三种窗口函数:

  • 排名函数
  • 分析函数
  • 聚合函数

排名函数

SQL DataFrame 含义
rank rank
dense_rank denseRank  
percent_rank percentRank
ntile ntile
row_number rowNumber

分析函数

SQL DataFrame 含义
cume_dist cumeDist
first_value firstValue
last_value lastValue
lag lag
lead lead

聚合函数

(略)

应用窗口函数

  • SQL
  • DataFrame

定义窗口

窗口规范定义了哪些行会被包含进给定行所关联的数据帧。窗口规范中包含有三部分:分区定义、排序定义、数据帧定义。

OVER (PARTITION BY ... ORDER BY ...)

定义分区

分区规范控制了哪些行会被分区到一起。如果不指定分区,那么所有数据会被收集到一台机器上。

定义排序

排序规范控制了数据在分区内的排序方式,确定了数据在分区内的物理位置。

定义数据帧

数据帧描述了当前行所关联的数据帧包含哪些记录行。定义数据帧需要指定:起始边界、结束边界、以及帧类型。

边界

  • UNBOUNDED PRECEDING、UNBOUNDED FOLLOWING:分别表示分区内第一行和分区内最后一行;
  • CURRENT ROW:表示当前行;
  • {n} PRECEDING、{n} FOLLOWING:其中,n表示距离当前行所在位置的偏移量,这两种边界所表达的具体含义根据数据帧类型而有所不同;

类型

Row帧

Range帧

参考

  1. https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html
  2. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics