我可以使用╒════════════════════════════════════════════════════════╕
│"items[0]" │
╞════════════════════════════════════════════════════════╡
│{"prop2":123123,"date":123,"prop1":"a","prop3":"c54655"}│
├────────────────────────────────────────────────────────┤
│{"prop2":456464,"date":110,"prop1":"b","prop3":"d46546"}│
├────────────────────────────────────────────────────────┤
│{"prop2":454211,"date":103,"prop1":"c","prop3":"e45645"}│
└────────────────────────────────────────────────────────┘
创建一个时间戳类型的新列:
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
返回一列,而不是一个整数字。
任何人都有任何建议如何实现这一目标? 我顺便使用Spark v1.6.0,但我没有选择使用更高版本。
答案 0 :(得分:2)
您可以将日期列转换为时间戳列:
df = df.withColumn('date', df.date.cast('timestamp'))
您可以通过强制转换为时间戳添加分钟,然后在添加分钟后返回时间戳(以秒为单位 - 以下示例添加了一小时):
df = df.withColumn('timeadded', (df.date.cast('long') + 3600).cast('timestamp'))