如何计算下一次故障的时间

时间:2019-05-13 13:49:47

标签: join pyspark

我的目标是为每个时间戳计算下一次失败的时间。

我已经实现了一种方法,首先创建一个带有所有失败时间戳的日期框架,然后将其与条件一起加入

H.show()

            Timestamp      state
0   2017-03-30 03:51:57.900 OK
1   2017-03-30 03:51:58.000 OK
2   2017-03-30 03:51:58.100 NOK
3   2017-03-30 03:51:58.200 OK
4   2017-03-30 03:51:58.300 NOK

failures = H.filter(H['state'] == 'NOK').select('Timestamp')\
.selectExpr('Timestamp as Failure_time')
M = H.join(failures, F.col('Timestamp') <= F.col("Failure_time"))
               Timestamp    state   Failure_time
0   2017-03-30 03:51:57.900 OK  2017-03-30 03:51:58.100
1   2017-03-30 03:51:57.900 OK  2017-03-30 03:51:58.300
2   2017-03-30 03:51:58.000 OK  2017-03-30 03:51:58.100
3   2017-03-30 03:51:58.000 OK  2017-03-30 03:51:58.300
4   2017-03-30 03:51:58.100 NOK 2017-03-30 03:51:58.100
5   2017-03-30 03:51:58.100 NOK 2017-03-30 03:51:58.300
6   2017-03-30 03:51:58.200 OK  2017-03-30 03:51:58.300
7   2017-03-30 03:51:58.300 NOK 2017-03-30 03:51:58.300

M= M.groupBy('Timestamp').agg(F.min('Failure_time').alias('Next_Failure'))\
.orderBy('Timestamp')

               Timestamp           Next_Failure
0   2017-03-30 03:51:57.900 2017-03-30 03:51:58.100
1   2017-03-30 03:51:58.000 2017-03-30 03:51:58.100
2   2017-03-30 03:51:58.100 2017-03-30 03:51:58.100
3   2017-03-30 03:51:58.200 2017-03-30 03:51:58.300
4   2017-03-30 03:51:58.300 2017-03-30 03:51:58.300

此方法完成了所需的工作,但是对于只有150万条记录的数据帧来说,则花费了非常长的时间(对于一台功能非常强大的机器来说,大约需要两天时间)。

请问有人可以提供一种更有效的方法吗?正是我想避免完全联接和groupBy聚合。

非常感谢

0 个答案:

没有答案