Pyspark基于时间差的计算场

Pyspark基于时间差的计算场,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我有一张这样的桌子: 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_

我有一张这样的桌子:

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  |
最后,我需要为每一行创建一个speed列,如下所示:

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  |
所以这就是我想要达到的目标。我想我应该添加一个interium列来提供帮助,名为
trip\u time
,它是对
tpep\u dropoff\u datetime
-
tpep\u picku\u datetime
的计算。下面是我为实现这一点而做的代码:

df4 = df.withColumn('trip_time', df.tpep_dropoff_datetime - df.tpep_pickup_datetime)
这是一个很好的行程时间列:

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')))
但这给了我一个错误:
分析异常:由于数据类型不匹配,无法解析“(
行程距离
/
行程时间
)”:在“(
行程距离
/
行程时间
)”中存在不同的类型(浮动和间隔)


有更好的方法吗?

一个选项是将时间转换为以秒为单位的unix\u时间戳,然后可以进行减法运算,将时间间隔作为整数,可以进一步用于计算速度:

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|
+-------------+--------------------+---------------------+-----+