hive中如何进行按周计算

最近遇到一个需求,有一些统计数据,原本是按月更新的计算的,但是现在要按周更新计算。

在hive表中,月更数据一般按照一个月的最后一天进行分区存储,那么如果是按月更新的话直接根据分区进行计算就可以了。

而对于日更的数据,如果要按月计算的话,可以通过substr()函数将日期进行切分,取出只带月份的数据。

例如,对于dt = 2022-02-19这个日期,可以通过substr(dt, 1, 7)取出dt = 2022-02

select substr('2022-02-19', 1, 7);

输出:

2022-02

但是如果要按周计算的话,单纯的substr()就没法达到效果了,可以借助weekofyear()函数,它返回给定日期的周数(1到53之间的数字)。

例如,还是对于dt = 2022-02-19这个日期:

select weekofyear('2022-02-19');

输出:

7

代表2022-02-19是2022年的第7周。

但是这个函数还有一个问题,weekofyear()函数要求一年的第一周必须大于3天。

举个例子:

select weekofyear('2022-01-01');

输出:

52

这是什么情况?2022-01-01明明是2022年的第一天,输出个52是什么意思?

在这里插入图片描述
原来2022-01-01是周六,前面有5天还在2021年,是2021年的第52周。

也就是说,2022-01-01所在的周,只有两天在2022年,其余5天都在2021年,所以weekofyear()函数就认为这一周属于2021年的第52周。

那么怎么解决hive中跨年周的问题呢?

weekofyear()函数要求一年的第一周必须大于3天,也就是说至少得有4天在某一年中。

所以,我们对于跨年那几天的日期,我们可以先得到它下周一的日期dt1,然后减去4天得到dt2,dt2所在的年份就是多的那一部分所在的年份,然后再拼上周数就可以啦。

例如:

select concat(year(date_sub(next_day('2022-01-01','monday'),4)), '-', weekofyear('2022-01-01'));

输出:

2021-52
select concat(year(date_sub(next_day('2021-12-31','monday'),4)), '-', weekofyear('2021-12-31'));

输出:

2021-52
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matrix 工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值