微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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|
+-------------+--------------------+---------------------+-----+

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。