Hive窗口函数unbounded preceding搭配current row与unbounded following的差异
Hive两类窗口边界定义的执行差异
代码示例
场景1:边界到当前行
from groceries select id, revenue, day, sum(revenue) over ( order by id rows between unbounded preceding and current row)
场景2:边界到全分区首尾
from groceries select id, revenue, day, sum(revenue) over ( order by id rows between unbounded preceding and unbounded following)
核心执行逻辑差异
两者的本质区别是窗口计算的生效范围不同:
- 场景1的
rows between unbounded preceding and current row:窗口范围为当前分区的第一行数据到当前正在计算的行,每一行执行sum计算时,仅统计当前行及之前所有行的revenue值。语句中的order by id会先将数据集按id升序排序,再逐行执行累计计算。 - 场景2的
rows between unbounded preceding and unbounded following:窗口范围覆盖当前分区的所有行,无论计算到哪一行,sum统计的都是整个分区内所有revenue的总和。这里的order by id仅会影响最终结果的排序,不会改变求和的统计范围。
如果over子句中额外添加了partition by分组字段,上述逻辑会在每个分组内部独立生效。
返回结果差异
我们用3行示例数据做对比:
| id | revenue | day |
|---|---|---|
| 1 | 10 | 1 |
| 2 | 20 | 2 |
| 3 | 30 | 3 |
- 场景1返回的是累计求和结果:三行对应的sum值分别为10、30、60,数值随id增大逐步递增,最后一行的sum值等于全表revenue总和。
- 场景2返回的是全分区求和结果:三行对应的sum值均为60,所有行的计算结果完全相同。
内容的提问来源于stack exchange,提问作者Shivangi
相关产品推荐
相关产品推荐

