2016-07-06 44 views
1

我一直在解決這個問題一段時間了。基本上我有一組簡單的UserId和TimeStamp數據。我想知道每星期有多少個不同的用戶ID出現,我的星期是在星期六 - 星期六而非星期一 - 星期天測量的,這是Weekofyear()使用的。Trick Weekofyear in Hive by shift the week,for counting

現在,我每星期硬編碼和運行查詢:

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

這導致相同的數字,如果我沒有減去一天。我不知道爲什麼這不起作用。我覺得應該有一種方法來解決這個問題。現在,如果我想按周收回所有數據,那麼我必須每週手動完成一次,這是不可持續的。有關如何更聰明地工作的任何建議?

謝謝。

回答

1

簡單的解決方案

您可以簡單地創建自己的公式,而不是與「年度周」預先定義的函數去 優勢:您將能夠採取任何一套7天爲一個星期。

在你的情況,因爲你想要的一週應該從週日到週六開始,我們將只需要週日的第一次約會在一年

EG-在2016年,第一個星期日是「2016年1月3日「這是Jan'16 --assumption第三屆考慮格式timestamp列‘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; 
+0

我想你想用較低的()向下舍?如果這樣在Hive中不起作用,但我作爲INT進行鑄造,似乎已經完成了這個訣竅!謝謝! –