hive中如何进行按周计算
最近遇到一個(gè)需求,有一些統(tǒng)計(jì)數(shù)據(jù),原本是按月更新的計(jì)算的,但是現(xiàn)在要按周更新計(jì)算。
在hive表中,月更數(shù)據(jù)一般按照一個(gè)月的最后一天進(jìn)行分區(qū)存儲(chǔ),那么如果是按月更新的話直接根據(jù)分區(qū)進(jìn)行計(jì)算就可以了。
而對(duì)于日更的數(shù)據(jù),如果要按月計(jì)算的話,可以通過(guò)substr()函數(shù)將日期進(jìn)行切分,取出只帶月份的數(shù)據(jù)。
例如,對(duì)于dt = 2022-02-19這個(gè)日期,可以通過(guò)substr(dt, 1, 7)取出dt = 2022-02。
select substr('2022-02-19', 1, 7);輸出:
2022-02但是如果要按周計(jì)算的話,單純的substr()就沒(méi)法達(dá)到效果了,可以借助weekofyear()函數(shù),它返回給定日期的周數(shù)(1到53之間的數(shù)字)。
例如,還是對(duì)于dt = 2022-02-19這個(gè)日期:
select weekofyear('2022-02-19');輸出:
7代表2022-02-19是2022年的第7周。
但是這個(gè)函數(shù)還有一個(gè)問(wèn)題,weekofyear()函數(shù)要求一年的第一周必須大于3天。
舉個(gè)例子:
select weekofyear('2022-01-01');輸出:
52這是什么情況?2022-01-01明明是2022年的第一天,輸出個(gè)52是什么意思?
原來(lái)2022-01-01是周六,前面有5天還在2021年,是2021年的第52周。
也就是說(shuō),2022-01-01所在的周,只有兩天在2022年,其余5天都在2021年,所以weekofyear()函數(shù)就認(rèn)為這一周屬于2021年的第52周。
那么怎么解決hive中跨年周的問(wèn)題呢?
weekofyear()函數(shù)要求一年的第一周必須大于3天,也就是說(shuō)至少得有4天在某一年中。
所以,我們對(duì)于跨年那幾天的日期,我們可以先得到它下周一的日期dt1,然后減去4天得到dt2,dt2所在的年份就是多的那一部分所在的年份,然后再拼上周數(shù)就可以啦。
例如:
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總結(jié)
以上是生活随笔為你收集整理的hive中如何进行按周计算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python执行 SQL 命令并实时打印
- 下一篇: LeetCode Algorithm 2