在Hive里,通过改变一周的时间来骗取一年中的日期

zpjtge22  于 2021-06-29  发布在  Hive
关注(0)|答案(1)|浏览(327)

我研究这个问题已经有一段时间了。基本上,我有一组简单的数据,包括用户ID和时间戳。我想知道每周有多少个不同的userid出现,关键是我的一周是星期天星期六,而不是星期一-星期天,这是weekofyear()使用的。
现在我每周都在硬编码并运行查询:

SELECT
count(distinct UserId)
FROM data.table
where from_unixtime((CAST(timestamp as BIGINT))) 
       between TO_DATE("2016-06-05") AND TO_DATE("2016-06-12")

我正试图找到一种方法,将时间戳向后移一天,以欺骗一年中的一周,使其认为我的星期天实际上是星期一,但没有成功。我最近徒劳的尝试看起来像:

SELECT
count(distinct UserId), weekofyear(date_sub(from_unixtime(CAST(timestamp as BIGINT)),1))
FROM table.data
where from_unixtime((CAST(timestamp as BIGINT)))
       between TO_DATE("2016-06-01") AND TO_DATE("2016-06-30")
       group by weekofyear(date_sub(from_unixtime(CAST(timestamp as BIGINT)),1))

结果是相同的数字,就像我没有减去一天一样。我不知道为什么这样不行。我觉得应该有办法解决这个问题。现在如果我想按周提取x为真的所有数据,我必须每周手动提取,这是不可持续的。对如何更聪明地工作有什么建议吗?
谢谢您。

mxg2im7a

mxg2im7a1#

简单的解决方案
您可以简单地创建自己的公式,而不必使用“一年中的一周”的预定义函数优势:您可以在一周内使用任何一组7天。
在你的情况下,既然你希望一周从星期天开始,我们只需要一年中星期天的第一个日期
例如,2016年的第一个星期天是2016年1月3日,即2016年1月16日的第3个星期天——假设时间戳列的格式为“yyyy-mm-dd”

SELECT
    count(distinct UserId), lower(datediff(timestamp,'2016-01-03') / 7) + 1 as week_of_the_year 
    FROM table.data 
    where timestamp>='2016-01-03'
    group by lower(datediff(timestamp,'2016-01-03') / 7) + 1;

相关问题