Hive窗口函数中range和rows的区别
说明
聊到 hive,就少不了灵活的开窗函数,今天介绍下开窗函数中 over 子句内部经常会用到的 rows 和 range 的用法;
数据准备
create table temp_id_0116 ( id int ) stored as orc tblproperties ("orc.compress" = "snappy"); insert into temp_id_0116 (id) values (1), (1), (3), (6), (6), (6), (7), (8), (9); select * from temp_id_0116; 1 1 3 6 6 6 7 8 9
查询演示
select id, sum(id) over (order by id ) default_num, sum(id) over (order by id range between unbounded preceding and current row) range_sum, sum(id) over (order by id rows between unbounded preceding and current row) rows_sum, sum(id) over (order by id range between 1 preceding and 2 following) range_sum1, sum(id) over (order by id rows between 1 preceding and 2 following) rows_sum1 from temp_id_0116;
结果: 注意:
rows 是物理窗口,是哪一行就是哪一行,与当前行的值(order by key 的 key 的值)无关,只与排序后的行号相关,就是我们常规理解的那样。 range 是逻辑窗口,与当前行的值有关(order by key 的 key 的值),在 key 上操作 range 范围。
结果分析
1.当order by后面的rows/range缺失时,默认是range between unbounded preceding and current row
2、range_sum 按照 order by 的值进行划分窗口大小,由于出现两个id = 1 的记录,两个1 会划分到同一个窗口,所以第一行和第二行两个1进行了求和都是2,第三行进行累加5,第4 5 6 三行都是6,再一次同时划分到了同一个窗口进行累加,7 8 9 分别和第3行一样
3、rows_sum :rows 与排序值无关,与排序后的序号有关,所以在进行汇总求和的时候,即使遇到数值相同的数据,但是由于排序后的序号不同,不会将两个相同的数同时划分到同一个窗口。
后面两列划分方式和之前两列一样;
平时工作中 range可应用于订单日期等纬度值,rows可应用于金额,用户数汇总值;