Pyspark根据关闭时间差计算字段

问题描述

我有一个看起来像这样的表:

trip_distance | tpep_pickup_datetime | tpep_dropoff_datetime|
+-------------+----------------------+----------------------+
1.5           | 2019-01-01 00:46:40  |  2019-01-01 00:53:20 |

最后,我需要为每一行创建一个速度列,如下所示:

trip_distance | tpep_pickup_datetime | tpep_dropoff_datetime| speed |
+-------------+----------------------+----------------------+-------+
1.5           | 2019-01-01 00:46:40  |  2019-01-01 00:53:20 | 13.5  |

所以这就是我要达到的目标。我认为我应该添加一个中间列来提供帮助,称为trip_time,它是对tpep_dropoff_datetime-tpep_pickup_datetime的计算。这是我正在做的代码

df4 = df.withColumn('trip_time',df.tpep_dropoff_datetime - df.tpep_pickup_datetime)

这将产生一个不错的trip_time列:

trip_distance | tpep_pickup_datetime | tpep_dropoff_datetime|              trip_time|
+-------------+----------------------+----------------------+-----------------------+
1.5           | 2019-01-01 00:46:40  |  2019-01-01 00:53:20 |   6 minutes 40 seconds|

但是现在我想做速度专栏,这就是我想做的事情:

df4 = df4.withColumn('speed',(F.col('trip_distance') / F.col('trip_time')))

但这给了我这个错误AnalysisException: cannot resolve '( trip_distance / trip_time )' due to data type mismatch: differing types in '( trip_distance / trip_time )' (float and interval).;;

有更好的方法吗?

解决方法

一种选择是将时间转换为unix_timestamp(以秒为单位),然后可以进行减法运算,这将使您得到的间隔为整数,可以进一步用于计算速度:

import pyspark.sql.functions as f

df.withColumn('speed',f.col('trip_distance') * 3600 / (
  f.unix_timestamp('tpep_dropoff_datetime') - f.unix_timestamp('tpep_pickup_datetime'))
).show()

+-------------+--------------------+---------------------+-----+
|trip_distance|tpep_pickup_datetime|tpep_dropoff_datetime|speed|
+-------------+--------------------+---------------------+-----+
|          1.5| 2019-01-01 00:46:40|  2019-01-01 00:53:20| 13.5|
+-------------+--------------------+---------------------+-----+