我可以使用datetime.datetime()
创建一个时间戳类型的新列:
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()
返回:
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))]
到目前为止一切顺利,我可以合成时间戳列。 但是我实际上想做的是将现有日期值转换为时间戳并向其添加任意分钟数。我试过这个:
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
这是因为year()
返回列,而不是整数文本。
有人对我如何实现这一目标有任何建议吗?顺便说一下,我使用的是 Spark v1.6.0,但我无法选择使用更高版本。
您可以将日期列转换为时间戳列:
df = df.withColumn('date', df.date.cast('timestamp'))
您可以通过强制转换为 long 来向时间戳添加分钟数,然后在添加分钟后返回到时间戳(以秒为单位 - 下面的示例添加了一小时):
df = df.withColumn('timeadded', (df.date.cast('long') + 3600).cast('timestamp'))