Hive 實現將時間(時間戳)歸到某時間片

在進行數據處理或者建模的時候我們常常需要將某一時間段內的時間統一歸於到某一時刻,來表徵他們同屬於這一時間段。比如2017-12-19 13:23:30,我們按照10min作爲一個時間段向前劃分,這個時間會被劃分到2017-12-19 13:20:00,如果按照30min作爲一個時間段,這個時間會被劃分到2017-12-19 13:00:00。其他時間段長度可以依次類推。

如果使用python,scala,Java等語言來實現是一件很容易的事情,但是在工業生產環境中,我們希望可以直接HQL實現的還是用HQL,以下我們就使用純HQL來解決。

我們知道時間戳表示1970年至今的秒數,一個小時有3600秒,10分鐘爲600秒,所以我們使用時間戳來除600秒然後向下取整(扔掉餘數),得到的從1970年開始,到現在的時間段數量(10分鐘作爲一個時間段),然後這個值再乘上600,得到的就是所屬的那個時間片開始的時刻。舉例如下:

30分鐘作爲一個時間段

# 注意一點,hive的的除法會自動轉爲double類型,所以我們要加一個CAST
# 結果爲2017-11-11 13:00:00
SELECT DISTINCT FROM_UNIXTIME(60*30*CAST(UNIX_TIMESTAMP("2017-11-11 13:23:23")/(60*30) AS BIGINT), 'yyyy-MM-dd HH:mm:ss')
FROM test_table

10分鐘作爲一個時間段

# 注意一點,hive的的除法會自動轉爲double類型,所以我們要加一個CAST
# 結果爲2017-11-11 13:20:00
SELECT DISTINCT FROM_UNIXTIME(60*10*CAST(UNIX_TIMESTAMP("2017-11-11 13:23:23")/(60*10) AS BIGINT), 'yyyy-MM-dd HH:mm:ss')
FROM test_table
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章