hive实现类似滑动窗口效果

1 篇文章 0 订阅

hive通过range between 开窗时间滑动窗口

问题

之前,有个需求,有点类似spark的开窗函数实现的东西。不知道在hive上怎么实现。
百度了一下,没有发现好的实现方法,有一个是通过join来实现的,不是很优雅。自己通过开窗函数也出来一个,总感觉也不是很完美。

解决

今天深入学习了一下range between 和rows between的区别以后,突然发现range between就可以完美的实现这个功能。
贴出来交流一下,供大家参考使用。

回忆一下range between 和 rows between的用法

create table tmp.tmp_test_range_rows(
    id int,
    date_day date
) stored as orc 
;
insert into tmp.tmp_test_range_rows (id, date_day)
values (1, '2023-01-01')
    , (1, '2023-01-03')
    , (3, '2023-01-05')
    , (6, '2023-01-07')
    , (6, '2023-01-08')
    , (6, '2023-01-09')
    , (7, '2023-01-10')
    , (8, '2023-01-12')
    , (9, '2023-01-15')
;
select id,sum(id) over(order by id) as sum_id
    , sum(id) over(order by id range between unbounded preceding and current row ) as sum_range
    , sum(id) over(order by id range between 1 preceding and 2 following ) as sum_range2
    , sum(id) over(order by id rows between 1 preceding and 2 following ) as sum_rows2
from tmp.tmp_test_range_rows a 
;
idsum_idsum_rangesum_range2sum_rows2
12255
122511
355316
623233321
623233325
623233327
730304230
838382424
947471717
分析
  1. 当order by后面的rows/range缺失时,默认是range between
  2. 关于sum_range2 分析,order by id,所以要看id的值,并对id进行range操作,即[id-1, id+2]

hive 开窗实现滑动窗口

有了上面的经验,我们可以对日期range,然后开窗滑动
例如,我们开个近7天的窗口

select id, date_day
    , sum(id) over(order by date_day range between 6 preceding and current row ) as sum_range2
    , sum(id) over(order by date_day rows between 6 preceding and current row ) as sum_rows2
from tmp.tmp_test_range_rows a 
;
iddate_daysum_range2sum_rows2
12023-01-0111
12023-01-0322
32023-01-0555
62023-01-071111
62023-01-081617
62023-01-092223
72023-01-102830
82023-01-123337
92023-01-153045

类似实现了滑动窗口的效果
月的和小时的可以使用类似的技术来实现

交流

欢迎大家留言交流hql的花样写法。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值