通过改变周来欺骗Hive Weekofyear,计算

时间:2016-07-06 20:38:00

标签: date hive 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")

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

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))

这导致相同的数字,好像我没有减去一天。我不确定为什么这不起作用。我觉得应该有办法管理这个。现在,如果我想按周将所有数据提取到WHERE X为真,我必须每周手动完成,这是不可持续的。关于如何更聪明地工作的任何建议?

谢谢。

1 个答案:

答案 0 :(得分:1)

简单解决方案

您可以简单地创建自己的公式,而不是使用“一年中的一周”的预定义功能     优势:您可以在一周内完成7天的任何一套。

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

例如 - 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;