在 PySpark Python 中减去两个日期列

Posted

技术标签:

【中文标题】在 PySpark Python 中减去两个日期列【英文标题】:Subtracting two date columns in PySpark Python 【发布时间】:2017-12-07 18:16:18 【问题描述】:

我正在尝试在 Python 中减去 PySpark Dataframe 中的两列我遇到了很多问题,我的列类型为时间戳,列是 date1 = 2011-01-03 13:25:59 并想从其他日期列中减去它 @987654323 @ 所以我想要 date2 - date1 并从这些数据框列中创建一个单独的 timediff 列,它显示了这两个列的差异,例如 timeDiff = 00:01:01

如何在 PySaprk 中做到这一点

我尝试了以下代码:

#timeDiff = df.withColumn(('timeDiff', col(df['date2']) - col(df['date1'])))

此代码无效

我尝试做这个简单的事情:

timeDiff = df['date2'] - df['date1']

这确实有效,但之后我尝试通过以下代码将此单独的列添加到我的数据框中

df = df.withColumn("Duration", timeDiff)

出现以下错误:

Py4JJavaError: An error occurred while calling o107.withColumn.
: org.apache.spark.sql.AnalysisException: cannot resolve '(`date2` - `date1`)' due to data type mismatch: '(`date2` - `date1`)' requires (numeric or calendarinterval) type, not timestamp;;

任何人都可以用任何其他方法帮助我,或者我该如何解决这个错误??

【问题讨论】:

【参考方案1】:
from pyspark.sql.functions import unix_timestamp

#sample data
df = sc.parallelize([
    ['2011-01-03 13:25:59', '2011-01-03 13:27:00'],
    ['2011-01-03 3:25:59',  '2011-01-03 3:30:00']
]).toDF(('date1', 'date2'))

timeDiff = (unix_timestamp('date2', "yyyy-MM-dd HH:mm:ss") - unix_timestamp('date1', "yyyy-MM-dd HH:mm:ss"))
df = df.withColumn("Duration", timeDiff)
df.show()

输出是:

+-------------------+-------------------+--------+
|              date1|              date2|Duration|
+-------------------+-------------------+--------+
|2011-01-03 13:25:59|2011-01-03 13:27:00|      61|
| 2011-01-03 3:25:59| 2011-01-03 3:30:00|     241|
+-------------------+-------------------+--------+

【讨论】:

【参考方案2】:

同意以上答案,谢谢!

但我认为可能需要更改为:

timeDiff = (unix_timestamp(F.col('date2'), "yyyy-MM-dd HH:mm:ss") - unix_timestamp(F.col('date1'), "yyyy-MM-dd HH:mm:ss"))

给定

import pyspark.sql.functions as F

【讨论】:

以上是关于在 PySpark Python 中减去两个日期列的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:基于所有列减去/差异 pyspark 数据帧

在 pyspark.pandas 中添加/减去日期时间

如何在sql中减去两个日期列和两个时间列

熊猫:减去两个日期列,结果是一个整数

减去 Pandas 或 Pyspark 数据框中的连续列

使用 group_by 时出错,而不是在减去两个日期列 R 时使用排列时出错