通过改变周数来欺骗 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;
我已经研究这个问题一段时间了。基本上我有一组简单的数据,其中包含 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;