我正在尝试计算每个小时时段内运行的进程数。我的输入数据集看起来像这样。
process_id start_time end_time
PID10001 2018-08-01 00:00:00 2018-08-01 00:10:00
PID10002 2018-08-01 01:00:00 2018-08-01 00:20:00
PID10003 2018-08-01 00:00:00 2018-08-01 02:30:00
PID10004 2018-08-01 02:00:00 2018-08-01 04:00:00
这是我试图从上述输入数据集中获取的输出。根据start_time和end_time值将每个进程标记为适当的小时时隙。
process_id start_time end_time hour_slots
PID10001 2018-08-01 00:00:00 2018-08-01 00:10:00 00-01
PID10002 2018-08-01 01:00:00 2018-08-01 00:20:00 01-02
PID10003 2018-08-01 00:00:00 2018-08-01 02:30:00 00-01
PID10003 2018-08-01 00:00:00 2018-08-01 02:30:00 00-01
PID10003 2018-08-01 00:00:00 2018-08-01 02:30:00 02-03
PID10004 2018-08-01 02:00:00 2018-08-01 04:00:00 02-03
PID10004 2018-08-01 02:00:00 2018-08-01 04:00:00 03-04
NULL NULL NULL 05-06
NULL NULL NULL 06-07
NULL NULL NULL 07-08
NULL NULL NULL 08-09
NULL NULL NULL 09-10
NULL NULL NULL 10-11
NULL NULL NULL 11-12
NULL NULL NULL 12-13
NULL NULL NULL 13-14
NULL NULL NULL 14-15
NULL NULL NULL 15-16
NULL NULL NULL 16-17
NULL NULL NULL 17-18
NULL NULL NULL 18-19
NULL NULL NULL 19-20
NULL NULL NULL 20-21
NULL NULL NULL 21-22
NULL NULL NULL 22-23
NULL NULL NULL 23-00
我们如何在Hive中获得此结果?我一直坚持根据start_time和end_time为每个process_id复制行。如果结束时间在多个小时窗口中重叠,则应使用相应的hour_slots生成每个新行。任何帮助或建议,表示赞赏。谢谢!
答案 0 :(得分:0)
我认为您想要的是hour_slots中的开始时间和结束时间。 hour_slots是通过从开始时间和结束时间中提取小时,然后将它们串联在一起来计算的。
hive> select pid,start_time,end_time,concat((split((split(start_time,' ')[1]),':')[0]),'-',(split((split(end_time,' ')[1]),':')[0])) hour_slots from test;
OK
PID10001 2018-08-01 00:00:00 2018-08-01 00:10:00 00-00
PID10002 2018-08-01 01:00:00 2018-08-01 00:20:00 01-00