整体思路
rank和row_number使用起来的区别就是相同的排序,rank是相同的,并且排名不是连续的,核心算法就是UDAF,详细见。。。
了解开窗函数参考https://blog.csdn.net/samll_DATA/article/details/119598024?spm=1001.2014.3001.5501
窗口函数和window字句
关键是理解ROWS BETWEEN含义,也叫做WINDOW子句:
PRECEDING:往前
FOLLOWING:往后
CURRENT ROW:当前行
UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING:表示到后面的终点
支持window字句的源码分析
sum字句
-
GenericUDAFSumLong buff 存的是long:就是当前分区下所有的累加和
-
StreamingState extends AbstractAggregationBuffer : result存的是(list)分区每一行的结果,比如就是 前10行到,前两行的结果
-
SumAvgStreamingState extends StreamingState:intermediateVals存的是(list)用来计算结果的,比如当前结果:S[x…y] = S[y] - S[x-1],也就是每一行从开头的累加和,窗口的和只用通过减法就可以得到.
-
核心算法思想: S n S_{n} Sn代表分区0到numRows=n的和,如果保证,m-n刚好就是窗口windowSize的大小,那么 S m − S n S_{m}-S_{n} Sm−Sn就代表某一行的结果(就是某个窗口的和)。具体实现如下
1、这里也考虑一个相对复杂的特殊情况,CASE:X preceding and Y preceding,这里一般分三种情况a、窗口没有数据;b、窗口只有部分数据;c、窗口全部数据
2、来数据o,得到累计和sum,减去并移除intermediateVals[0],得到结果s,result.add(s),intermediateVals.add(sum)
3、回到第2,直到没有数据
4、ternite 方法补充数据
核心算法代码实现主要涉及两个方法iterate和terminate
public void iterate(AggregationBuffer agg, Object[] parameters)
throws HiveException {
SumAvgStreamingState ss