通过改变周数来欺骗 Hive 中的 Weekofyear

Tricking Weekofyear in Hive by shifting the week, for counting

我已经研究这个问题一段时间了。基本上我有一组简单的数据,其中包含 UserId 和 TimeStamp。我想知道每周有多少个不同的 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")

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

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 为真,我必须每周手动执行,这是不可持续的。关于如何更聪明地工作有什么建议吗?

谢谢。

简单的解决方案

您可以简单地创建自己的公式,而不是使用 "week of the year" 的预定义函数 优势:一周7天任意一组都可以。

在你的情况下,因为你希望一周从星期日到星期六开始,我们只需要一年中星期日的第一个日期

eg- 在 2016 年,第一个星期日是 '2016-01-03',即 2016 年 1 月 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;