Spark SQL高级分析函数

本节将介绍Spark SQL提供的高级分析函数。包括:

  • 使用多维聚合函数
  • 使用时间窗口聚合函数
  • 使用窗口分析函数

使用多维聚合函数

在高级分析函数中,第一个是关于多维聚合的,它对于涉及分层数据分析的用例非常有用,在这种情况下,通常需要在一组分组列中计算子总数和总数。

rollup和cube基本上是在多列上进行分组的高级版本,它们通常用于在这些列的组合和排列中生成子总数和大总数。所提供的一组列的顺序被视为分组的层次结构。

rollup

当使用分层数据时,比如不同部门和分部的销售收入数据等,rollup可以很容易地计算出它们的子总数和总数。rollup按给定的列集的层次结构,并且总是在层次结构中的第一列启动rolling up过程。

cube

一个cube基本上是一个更高级的rollup。它在分组列的所有组合中执行聚合。因此,结果包括rollup提供的以及其他组合所提供的。

使用时间窗口聚合函数

在高级分析函数中,第二个功能是基于时间窗口执行聚合,这在处理来自物联网设备的事务或传感器值等时间序列数据时非常有用。

在Spark 2.0中引入了时间窗口的聚合,使其能够轻松地处理时间序列数据,这些数据由一系列的时间顺序数据点组成。这种数据集在金融或电信等行业很常见。

例如,股票市场交易数据集有交易日期、开盘价、收盘价、交易量和每个股票代码的其他信息。时间窗口聚合可以帮助回答问题,比如京东股票的周平均收盘价,或者京东股票跨每一周的月移动平均收盘价。

时间窗口函数有几个版本,但是它们都需要一个时间戳类型列和一个窗口长度,该窗口长度可以指定为几秒、几分钟、几小时、几天或几周。窗口长度代表一个时间窗口,它有一个开始时间和结束时间,它被用来确定一个特定的时间序列数据应该属于哪个桶。

有两种类型的时间窗口:滚动窗口和滑动窗口。与滚动窗口(也叫固定窗口)相比,滑动窗口需要提供额外的输入参数,用来说明在计算下一个桶时,一个时间窗口应该滑动多少。

在我们的视频教程中,我们将使用京东股票交易,可以在雅虎财经网站上找到。

使用窗口分析函数

在高级分析函数中,第三个是在逻辑分组中执行聚合的能力,这个逻辑分组被称为窗口。

有时需要对一组行进行操作,并为每个输入行返回一个值。窗口函数提供了这种独特的功能,使其易于执行计算,如移动平均、累积和或每一行的rank。使用窗口函数,我们能够轻松地执行例如移动平均、累积和/或每一行的排名这样的计算。它们显著提高了Spark的SQL和DataFrame API的表达能力。

使用窗口函数有两个主要步骤。

  • 第一步是定义一个窗口规范,该规范定义了称为frame的行逻辑分组,这是每一行被计算的上下文。
  • 第二步是应用一个合适的窗口函数。

窗口函数可分为三种类型:排序函数、分析函数和聚合函数。在下面两个表中分别描述了排序函数和分析函数。对于聚合函数,可以使用前面提到的任何聚合函数作为窗口函数。

排序函数:

函数名称 描述
rank 返回一个frame内行的排名和排序,基于一些排序规则
dense_rank 类似于rank,但是在不同的排名之间没有间隔,紧密衔接显示
ntile(n) 在一个有序的窗口分区中返回ntile分组ID。比如,如果n是4,那么前25%行得到的ID值为1,第二个%25行得到的ID值为2,依次类推。
row_number 返回一个序列号,每个frame从1开始

分析函数:

函数名称 描述
cume_dist 返回一个frame的值的累积分布。换句话说,低于当前行的行的比例。
lag(col,offset) 返回当前行之前offset行的列值
lead(col,offset) 返回当前行之后offset行的列值

详细讲解

关于Spark SQL高级分析函数的讲解,请参考视频:Spark SQL窗口分析函数和时间窗口函数


《Spark原理深入与编程实战》