当前位置: 首页 > 面试题库 >

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

陶烨赫
2023-03-14
问题内容

我有带有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开始,您可以使用许多日期处理功能:

  • pyspark.sql.functions.year
  • pyspark.sql.functions.month
  • pyspark.sql.functions.dayofmonth
  • pyspark.sql.functions.dayofweek()
  • pyspark.sql.functions.dayofyear
  • pyspark.sql.functions.weekofyear()

    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|

    +----+-----+—+

您可以将simplemap与其他任何RDD一起使用:

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无论如何都存储一个小时,所以分开保存似乎浪费了内存。



 类似资料:
  • 问题内容: 我在String上有个约会,像这样: 我想将其划分为: 做这个的最好方式是什么? 问题答案: 在Java中拆分字符串的一种方法是使用.split(“ regex”),该方法根据提供的模式拆分字符串,并返回String数组。 获取当前日期:您还可以通过更改传递给SimpleDateFormat的值来更改日期格式。不要忘记进口。

  • 当我使用以下代码时,Object错误。 谁能告诉我如何从年、月和日的值中获取Date对象?

  • 我当前有带有日期的表,以YYYY-MM-DD格式设置为VARCHAR,例如: 我使用的日期列名为'event_dt' 但我得到的只有 我已经尝试了Presto文档中列出的一些其他方法,但一点也不走运。我知道这可能是非常简单的,但任何帮助将非常感谢。

  • 问题内容: 我目前正在开发一个显示文件的应用程序,并允许成员通过许多不同的参数来搜索这些文件,其中一个是日期范围。 我遇到的问题是数据库架构不是我自己开发的,数据库的创建者创建了一个“ date”表,其中包含“ day”,“ month”,“ year”字段。 我想知道如何从表中选择特定的日期,月份,年份,并在SQL中创建日期对象,以便可以比较用户使用BETWEEN输入的日期。 下面是日期表的结构

  • 问题内容: 我需要从他们的出生日期开始计算“客户”的年龄。 我尝试使用以下方法: DATEDIFF(年,customer.dob,“ 2010-01-01”); 但这似乎不起作用。 有任何想法吗?我知道这将变得简单! 谢谢 问题答案: 几种方法: 希望这对您有帮助