需求:
就是时间段为10分钟粒度.有用户点击行为日志的时间戳.对用户点击量进行统计
实现思路:
- 因为数据有时间戳,可以通过from_unixtime()来获取具体的时间
- 有了具体的时间,就可以用minute()函数获取对应数据所在的分钟.minute()函数获取分钟为字符串
- 想法 00 - 10 应该分到一组, 10 - 20 应该分到第二组,依次类推.
- 用minute 整除 10 的话, 00 - 10 整除 10 都为 0, 10 - 20 整除 10 都为1,依次类推
- 这样就可以把每10分钟的数据都分到了一组.
- 注意,hive中的 minute / 10 的话并能整除,所以需要函数向下取整,用floor()函数来完成.
具体实现:
- 先通过时间戳取到数据对应的小时和分钟.
- 小时 from_unixtime(time,'yyyyMMdd HH')
- 分钟 minute(from_unixtime(time))
- 对分钟进行整除10来完成分段.(同时需要对获取到的minute进行类型转换)
- floor(minute(from_unixtime(cast(oper_time as bigint )))/10)
- 如果要是变时间段的话,分钟为单位,除以相应的时间段就行.10分钟就整除10,15分钟就整除15.
- 对小时和(分钟整除的结果)进行分组进行统计.
示例代码:
select
case when time_sort = 0 then concat(dt,substring(time,10,11),'0',time_sort*10)
else concat(dt,substring(time,10,11),time_sort*10)
end as tm,
num
from
(
select
dt,time,time_sort,count(distinct uid) as num from
(
select
substr(dt,0,8) as dt,
uid,
from_unixtime(cast(oper_time as bigint ),'yyyyMMdd HH') as time,
floor(minute(from_unixtime(cast(oper_time as bigint)))/10) as time_sort
from test.table
where
dt between 2020090700 and 2020090723
) t
group by dt,time,time_sort
) tt;