PySpark中datetime类型列相减报错:无法解析interval类型的解决方法
PySpark中Timestamp类型列相减的正确实现方法
问题场景
已通过以下代码将字符串类型的departure_time和arrival_time转换为Timestamp类型:
df = df.withColumn('departure_time', to_timestamp('departure_time')) df = df.withColumn('arrival_time', to_timestamp('arrival_time'))
示例数据中arrival_time为09:00:00,departure_time为07:00:00,执行以下代码时触发错误:
df.withColumn(time_all , col(arrival_time) - col(departure_time))
错误提示:
could not parse datatype: interval
错误原因
直接用减号-操作PySpark的Timestamp列会返回Interval类型,但部分PySpark版本对直接生成Interval列的语法支持有限,导致类型解析失败。
正确实现方案
方案1:转为Unix时间戳计算数值型时间差
如果需要得到小时、分钟或秒级的数值型差值,可先将Timestamp转为Unix时间戳(秒数),再做减法后转换为目标单位:
from pyspark.sql.functions import col, unix_timestamp # 计算小时差 df = df.withColumn("time_all_hours", (unix_timestamp(col("arrival_time")) - unix_timestamp(col("departure_time")))/3600) # 计算秒数差 df = df.withColumn("time_all_seconds", unix_timestamp(col("arrival_time")) - unix_timestamp(col("departure_time")))
方案2:用expr执行SQL风格的时间差计算
如果需要保留Interval类型,或需要更灵活的时间差提取,可使用expr函数包裹SQL表达式:
from pyspark.sql.functions import expr # 生成Interval类型的时间差列 df = df.withColumn("time_all_interval", expr("arrival_time - departure_time")) # 直接提取时间差的小时数 df = df.withColumn("time_all_hours", expr("hour(arrival_time - departure_time)"))
注意事项
- Interval类型支持从Spark 2.2版本开始提供,若使用低版本建议优先选择方案1
- 方案1的兼容性更强,适合所有PySpark版本,且结果为数值类型,便于后续计算
内容的提问来源于stack exchange,提问作者MUNGUASAENG
相关产品推荐
相关产品推荐

