1. 程式人生 > >【hive】時間段為五分鐘的統計

【hive】時間段為五分鐘的統計

問題內容

  • 今天遇到了一個需求,需求就是時間段為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;