Hive开窗函数源码

本文深入探讨了Hive中的窗口函数,重点分析了sum和max开窗函数的源码实现。讲解了ROWS BETWEEN的含义,如PRECEDING、FOLLOWING和CURRENT ROW,并详细阐述了sum函数的StreamingState和intermediateVals在计算过程中的作用,以及max函数如何维护一个递减的maxChain队列来获取窗口内的最大值。
摘要由CSDN通过智能技术生成

整体思路

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字句

  1. GenericUDAFSumLong buff 存的是long:就是当前分区下所有的累加和

  2. StreamingState extends AbstractAggregationBuffer : result存的是(list)分区每一行的结果,比如就是 前10行到,前两行的结果

  3. SumAvgStreamingState extends StreamingState:intermediateVals存的是(list)用来计算结果的,比如当前结果:S[x…y] = S[y] - S[x-1],也就是每一行从开头的累加和,窗口的和只用通过减法就可以得到.

  4. 核心算法思想: S n S_{n} Sn代表分区0到numRows=n的和,如果保证,m-n刚好就是窗口windowSize的大小,那么 S m − S n S_{m}-S_{n} SmSn就代表某一行的结果(就是某个窗口的和)。具体实现如下
    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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值