在 PySpark 中减去两个日期列 Python
Subtracting two date columns in PySpark Python
我正在尝试在 Python 中减去 PySpark Dataframe
中的两列我在做这件事时遇到了很多问题,我将列类型作为时间戳,该列是 date1 = 2011-01-03 13:25:59
并且想从其他日期列 date2 = 2011-01-03 13:27:00
中减去它,所以我想要 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;;
任何人都可以用任何其他方法帮助我,或者我该如何解决这个错误??
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|
+-------------------+-------------------+--------+
同意以上回答,谢谢!
但我认为可能需要更改为:
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
我正在尝试在 Python 中减去 PySpark Dataframe
中的两列我在做这件事时遇到了很多问题,我将列类型作为时间戳,该列是 date1 = 2011-01-03 13:25:59
并且想从其他日期列 date2 = 2011-01-03 13:27:00
中减去它,所以我想要 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;;
任何人都可以用任何其他方法帮助我,或者我该如何解决这个错误??
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|
+-------------------+-------------------+--------+
同意以上回答,谢谢!
但我认为可能需要更改为:
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