再谈Hive开窗函数

开窗函数

开窗函数实际上是一种范围限定函数,将某种条件的集合限定在一个目标范围内,形象地称为窗口。在做SQL查询分析时与分析函数配合使用。

功能

我们在做SQL查询分析时通常会用到sum、count、average、min、max等函数或UDF。而这些函数通常与group by分组功能组合使用,用于在分组内聚合,聚合的结果返回一行记录。而开窗函数扩展了聚合分析,可通过指定窗口大小,让同一分组内返回多行记录(目标范围),窗口的大小决定着返回记录的多少,然后进行聚合分析得到结果。这大大提高了查询的灵活性和实用性。

OVER

开窗功能及窗口大小由OVER来指定。

  • 窗口为分区内起点到当前行

OVER (PARTITION BY grid_id ORDER BY day ASC) 按照grid_id来分区,分区内按照day升序排列,这里的窗口为分区内从起点到当前行的记录。

  • 窗口由range限定一个范围

OVER(ORDER BY high_speed RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING) 按照high_speed排序,窗口大小为一个范围区间[当前行值-2, 当前行值+2]。

  • 窗口限定为往前N行到往后N行

OVER(ORDER BY high_speed ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) 按照high_speed排序,窗口大小为当前行为基准,往前2行到往后2行。

  • 窗口限定为往前所有行及往后所有行

OVER(ORDER BY high_speed ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)

在之前的文章Hive窗口函数及分析函数功能和用法总结里边有关于窗口函数及分析函数的一点归纳总结,有兴趣的小伙伴可以看看。

PARTITION BY和GROUP BY

首先,我们需要知道PARTITION BY和GROUP BY的区别

1、它们不在同一个地方使用,GROUP BY用于记录分组使用,PARTITION BY用于组内分析使用。

2、就记录的字段保留来看,PARTITION BY会保留全部字段,并对指定的字段做排序,而GROUP BY只保留参与分组及排序的字段和聚合结果。

3、聚合函数作用于PARTITION BY上时,逐条累计结果(从第一行到当前行的结果),聚合函数作用于GROUP BY上时,结果为作用于整个分组上的结果。

4、就执行次序来看,通常SQL的执行顺序为 from->where->group by->having->select->order by,而partition by是在select执行完后的结果集上进行的。

前边也说到,PARTITION BY通常会用于和开窗及分析函数一起使用,用于分析或求得个体在当前样本中所占名次、比例等(反应个体相对部分整体的情况),数据分析中经常需要用到。这种功能大大丰富了数据分析的能力并简化了分析难度。

发布了95 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43878293/article/details/103762864