【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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM