В pyspark.sql.functions
есть функция datediff
, которая, к сожалению, рассчитывает разницу только в днях.Чтобы преодолеть это, вы можете преобразовать обе даты в метки времени Unix (в секундах) и вычислить разницу.
Давайте создадим несколько примеров данных, вычислим задержку, а затем разницу в секундах.
from pyspark.sql.functions import col, lag, unix_timestamp
from pyspark.sql.window import Window
import datetime
d = [{'id' : 1, 't' : datetime.datetime(2018,01,01)},\
{'id' : 1, 't' : datetime.datetime(2018,01,02)},\
{'id' : 1, 't' : datetime.datetime(2018,01,04)},\
{'id' : 1, 't' : datetime.datetime(2018,01,07)}]
df = spark.createDataFrame(d)
df.show()
+---+-------------------+
| id| t|
+---+-------------------+
| 1|2018-01-01 00:00:00|
| 1|2018-01-02 00:00:00|
| 1|2018-01-04 00:00:00|
| 1|2018-01-07 00:00:00|
+---+-------------------+
w = Window.partitionBy('id').orderBy('t')
df.withColumn("previous_t", lag(df.t, 1).over(w))\
.select(df.t, (unix_timestamp(df.t) - unix_timestamp(col('previous_t'))).alias('diff'))\
.show()
+-------------------+------+
| t| diff|
+-------------------+------+
|2018-01-01 00:00:00| null|
|2018-01-02 00:00:00| 86400|
|2018-01-04 00:00:00|172800|
|2018-01-07 00:00:00|259200|
+-------------------+------+