【hive】時間段為五分鐘的統計
阿新 • • 發佈:2018-11-13
問題內容
- 今天遇到了一個需求,需求就是時間段為5分鐘的統計.有資料的時間戳.對成交單量進行統計.
想法思路
- 因為資料有時間戳,可以通過from_unixtime()來獲取具體的時間.
- 有了具體的時間,就可以用minute()函式獲取對應資料所在的分鐘.(minute()獲取到的分鐘為字串,需要進行型別轉換cast())
- 那麼怎麼通過獲取到的minute來進行分組呢?
- 想法 00 - 05 應該分到一組, 05 - 10 應該分到第二組,依次類推.
- 用minute 整除 5 的話, 00 - 05 整除 5 都為 0, 05 - 10 整除 5 都為1,依次類推
- 這樣就可以把每5分鐘的資料都分到了一組.
- 注意,hive中的 minute / 5 的話並能整除,所以需要函式向下取整,用floor()函式來完成.
- 雖然把分鐘分開了,但是並不能僅僅按照分鐘來分組,這樣就把每個小時的相同分組分成一組,所以每個小時之間也是一個聚合維度.
具體步驟
- 先通過時間戳取到資料對應的小時和分鐘.
- 小時 from_unixtime(time,'yyyyMMdd HH')
- 分鐘 minute(from_unixtime(time))
- 對分鐘進行整除5來完成分段.(同時需要對獲取到的minute進行型別轉換)
- floor(cast(minute(from_unixtime(time)) as int) / 5)
- 如果要是變時間段的話,分鐘為單位,除以相應的時間段就行.10分鐘就整除10,15分鐘就整除15.
- 對小時和(分鐘整除的結果)進行分組進行統計.
示例SQL
select case when sort in (0,1) then concat(substring(time,10,11),':0',sort*5) else concat(substring(time,10,11),':',sort*5) end, --對時間格式程序處理,把小時和分鐘合併 例如,hour =2018111 00,sort = 1 -> 00:05 num --統計的欄位 from( select time,sort,count(distinct purchase_id) as num --統計 from ( select purchase_id,--需要統計的欄位 from_unixtime(add_time,'yyyyMMdd HH') as time, --取小時 floor(cast(minute(from_unixtime(add_time)) as int) / 5 ) as sort --按分鐘歸類 from kkgoo.kk_order_association where from_unixtime(add_time,'yyyyMMdd') = 20181111 --篩選條件 and status not in ('unpayed', 'close', 'timeout_pay', 'timeout_lock') ) t group by 1,2 --對小時和分鐘整除結果進行分組 ) t;