Pyspark 如何将date类型的列转换为datetime,并在其中添加几分钟?

Pyspark 如何将date类型的列转换为datetime,并在其中添加几分钟?,pyspark,apache-spark-sql,spark-dataframe,Pyspark,Apache Spark Sql,Spark Dataframe,我可以使用datetime.datetime()创建timestamp类型的新列: 导入日期时间 从pyspark.sql.functions导入 从pyspark.sql.types导入* df=sqlContext.createDataFrame([(datetime.date(2015,4,8))],StructType([StructField(“date”,DateType(),True)]) df=df.select(df.date,lit(datetime.datetime(20

我可以使用
datetime.datetime()
创建timestamp类型的新列:


导入日期时间
从pyspark.sql.functions导入
从pyspark.sql.types导入*
df=sqlContext.createDataFrame([(datetime.date(2015,4,8))],StructType([StructField(“date”,DateType(),True)])
df=df.select(df.date,lit(datetime.datetime(2017,1,1,0,1))。别名('datetime'))
df.printSchema()
df.collect()

返回:

root
 |-- date: date (nullable = true)
 |-- datetime: timestamp (nullable = false)
Out[13]:
[Row(date=u'2015-04-08', datetime=datetime.datetime(2017, 1, 1, 0, 1))]
到目前为止,我可以合成一个timestamp列。然而,我实际上想做的是将现有的日期值转换为时间戳,并向其添加一些任意的分钟数。我试过这个:

import datetime
from pyspark.sql.functions import lit
from pyspark.sql.types import *
df = sqlContext.createDataFrame([(datetime.date(2015,4,8),)], StructType([StructField("date", DateType(), True)]))
df = df.select(df.date, lit(datetime.datetime(2017, 1, 1, 0, 1)).alias('datetime'))
df.printSchema()
df.collect()
但它失败了,出现了错误:

TypeErrorTraceback (most recent call last)
<ipython-input-14-4edbbc99537e> in <module>()
      2 from pyspark.sql.types import *
      3 df = sqlContext.createDataFrame([(datetime.date(2015,4,8),)], StructType([StructField("date", DateType(), True)]))
----> 4 df = df.select(df.date, lit(datetime.datetime(year(df.date), 1, 1, 0, 1)).alias('datetime'))
      5 df.printSchema()
      6 df.collect()

TypeError: an integer is required
TypeErrorTraceback(最近一次调用上次)
在()
2从pyspark.sql.types导入*
3 df=sqlContext.createDataFrame([(datetime.date(2015,4,8))],StructType([StructField(“date”,DateType(),True)])
---->4 df=df.select(df.date,lit(datetime.datetime(year(df.date),1,1,0,1))。别名('datetime'))
5 df.printSchema()
6 df.collect()
TypeError:需要一个整数
这是因为
year()
返回一列,而不是整数文本

有人对我如何做到这一点有什么建议吗?
顺便说一下,我正在使用Spark v1.6.0,我没有选择使用更高版本。

您可以将日期列转换为时间戳列:

df = df.withColumn('date', df.date.cast('timestamp'))
您可以通过强制转换为long,将分钟添加到时间戳中,然后在添加分钟后返回到时间戳(以秒为单位-下面的示例添加了一小时):


您最初是将日期作为字符串还是日期?请看oops。是的,那是一根绳子,不是约会。我的错。我已经更新了这个问题,以便将日期显式地创建为日期。行为是一样的though@Psidom您提供的链接解决了问题,非常感谢。谢谢Bob。不错的解决方案,尽管我已经使用了Psidom链接到上面的解决方案。两种方法都很好,谢谢。
df = df.withColumn('timeadded', (df.date.cast('long') + 3600).cast('timestamp'))