文/朱季谦
先前遇到过一个需求,需要基于HIVE统计近N周范围的数据,例如,统计近7周范围的数据指标。
需要用HIVE SQL去实现该功能,而HIVE SQL并没有PostgreSQL那样例如通过函数to_char((to_date('202550', 'YYYWW') - INTERVAL '5 weeks'), 'yyyyww'))就可以实现202550和往前5周的202545周的查询(这里的50和45分别表示2025年的50周和45周)。
我当时通过百度和DeepSeek都没有找到合适的答案,还是思考了好几天才想明白怎么解决。
既然HIVE SQL没有函数可以直接实现取指定周与近N周的条件范围查询,是否可以有其他方式呢?
答案是肯定的。
我当时是通过额外建一个时间表,该表有天以及天对应的所在周,可以直接通过代码生成这样一张表date_week_table,直接 从2020年一直自动映射到2030年,该表的数据如下:
id | Day | Week |
---|---|---|
1 | 2020-01-01 | 202001 |
2 | 2020-01-02 | 202001 |
3 | 2020-01-03 | 202001 |
4 | 2020-01-04 | 202001 |
5 | 2020-01-05 | 202001 |
6 | 2020-01-06 | 202002 |
7 | 2020-01-07 | 202002 |
8 | 2020-01-08 | 202002 |
....... | ...... | ...... |
当有这一张周表,而需要查询近N周范围数据的主表由有week字段,例如主表commerce_data是这样的——
id | order_id | customer_id | product_id | week | total_amount |
---|---|---|---|---|---|
1 | ORD202315001 | 1001 | 5001 | 202501 | 5 |
2 | ORD202315002 | 1002 | 5002 | 202452 | 10 |
3 | ORD202315003 | 1003 | 5003 | 202451 | 22 |
4 | ORD202315004 | 1004 | 5004 | 202450 | 1 |
5 | ...... | ...... | ...... | ...... | ...... |
这时,如果需要统计指定周和前N周的数据,就可以基于这两张表去实现。
例如,查出2025年第1周往前近4周的数据。
可以基于date_week_table周表计算2025年第1周往前近4周都有哪些周,HIVE SQL如下:
select distinct week from date_week_table where week <= '202501' order by week desc limit 3
然后再基于commerce_data主表计算在2025年第1周往前近4周的数据——
select
sum(total_amount)
from commerce_data
where week in(select distinct week from date_week_table where week <= '202501' order by week desc limit 3)
group by order_id
这样,就可以实现查询出指定周及指定周近N周的HIVE SQL查询了。
当然,也有童鞋可能会说,既然只是查询近N周范围,是否可以直接使用指定周,再减去N来差呢?
这里会有一个问题,2025年第一周,即202501,往前两周,分别是202452和202451,如果用指定周202501直接减2,得到的并不是202451。
以上,只是我个人的一个思路,如果还有其他基于HIVE SQL来计算指定周及近N周的计算,可以留言区一块分享讨论。