python - Spark DataFrame TimestampType - 如何从字段中获取年、月、日值?

标签 python timestamp apache-spark pyspark

我有带有 take(5) 顶行的 Spark DataFrame,如下所示:

[Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=1, value=638.55),
 Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=2, value=638.55),
 Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=3, value=638.55),
 Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=4, value=638.55),
 Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=5, value=638.55)]

它的架构定义为:

elevDF.printSchema()

root
 |-- date: timestamp (nullable = true)
 |-- hour: long (nullable = true)
 |-- value: double (nullable = true)

如何从“日期”字段中获取年、月、日值?

最佳答案

从 Spark 1.5 开始,您可以使用许多日期处理函数:

import datetime
from pyspark.sql.functions import year, month, dayofmonth

elevDF = sc.parallelize([
    (datetime.datetime(1984, 1, 1, 0, 0), 1, 638.55),
    (datetime.datetime(1984, 1, 1, 0, 0), 2, 638.55),
    (datetime.datetime(1984, 1, 1, 0, 0), 3, 638.55),
    (datetime.datetime(1984, 1, 1, 0, 0), 4, 638.55),
    (datetime.datetime(1984, 1, 1, 0, 0), 5, 638.55)
]).toDF(["date", "hour", "value"])

elevDF.select(
    year("date").alias('year'), 
    month("date").alias('month'), 
    dayofmonth("date").alias('day')
).show()
# +----+-----+---+
# |year|month|day|
# +----+-----+---+
# |1984|    1|  1|
# |1984|    1|  1|
# |1984|    1|  1|
# |1984|    1|  1|
# |1984|    1|  1|
# +----+-----+---+

您可以像使用任何其他 RDD 一样使用简单的 map:

elevDF = sqlContext.createDataFrame(sc.parallelize([
    Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=1, value=638.55),
    Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=2, value=638.55),
    Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=3, value=638.55),
    Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=4, value=638.55),
    Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=5, value=638.55)]))

(elevDF
    .map(lambda (date, hour, value): (date.year, date.month, date.day))
    .collect())

结果是:

[(1984, 1, 1), (1984, 1, 1), (1984, 1, 1), (1984, 1, 1), (1984, 1, 1)]

顺便说一句,datetime.datetime 无论如何都会存储小时,因此将其分开似乎很浪费内存。

关于python - Spark DataFrame TimestampType - 如何从字段中获取年、月、日值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30949202/

相关文章:

python - Python 中的 MATLAB 定点函数 "fi"等效项

python - Django 模型翻译查询回退

python - 我一直在尝试在 PyGame 中制作游戏,但碰撞检测器不起作用

visual-studio - Visual Studio 2008调试窗口显示时间戳?

python - Spark RDD 到 DataFrame python

apache-spark - 在Java中实现自定义Spark RDD

python - 在Python中导入autocad绘图

sql - 使用时间戳差异将页面浏览量分组到 session 中

mysql - 试图找到船上最年轻线官的年龄MYSQL

apache-spark - Kafka NodePort服务在群集外部无法访问