计算 Hive/Spark/SQL 中的每小时进程计数
Posted
技术标签:
【中文标题】计算 Hive/Spark/SQL 中的每小时进程计数【英文标题】:Calculate hourly count of process in Hive/Spark/SQL 【发布时间】:2018-08-23 17:55:07 【问题描述】:我正在尝试计算每个小时槽中运行的进程数。我的输入数据集如下所示。
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 生成每个新行。任何帮助或建议表示赞赏。谢谢!
【问题讨论】:
hour_slots的逻辑是什么 hour_slots 分为 24 (0-23)。每个小时都属于一个单独的分区槽 Hos 是 hours_slot,与 start_time 和 end_time 相关。基于此,我们可以构建查询... 【参考方案1】:我认为您想要的是 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
【讨论】:
感谢您尝试这个。但这不是我要找的。请再看一遍问题。以上是关于计算 Hive/Spark/SQL 中的每小时进程计数的主要内容,如果未能解决你的问题,请参考以下文章
Flume+Spark+Hive+Spark SQL离线分析系统
如何引用列中的第一个非空字符串 - Cloudera Impala / Apache Hive / Spark SQL
无法从 impala/hive/spark sql 访问“spark 注册表”
通过 squirrel sql 连接到 hive/spark sql 时读取超时