【问题标题】:Create a new Date column from another datetime field - spark scala dataframe从另一个日期时间字段创建一个新的日期列 - spark scala dataframe
【发布时间】:2021-06-08 06:02:54
【问题描述】:

我正在尝试从数据框中的现有 dateTime 字段创建日期字段并出现错误

import java.sql.Timestamp
import java.time.{LocalDateTime, ZoneOffset}
import java.time.format.DateTimeFormatter
import org.apache.spark.sql.functions._

val tempdf = Seq(Timestamp.valueOf(LocalDateTime.of(2021, 3, 8, 18, 0))).toDF("Date1")
tempdf.withColumn("newDate",Timestamp.valueOf(LocalDateTime.of(year(add_months($"Date1",-1)),month(add_months($"Date1",-1)),1))).show()

预期输出:newDate 应该是“2021-2-1”(YYYY-MM-dd 格式),基本上回到之前的月份和年份和日期 1

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    您不能在 Spark 列上调用 LocalDateTime。您需要使用 Spark SQL 方法:

    import java.sql.Timestamp
    import java.time.{LocalDateTime, ZoneOffset}
    import java.time.format.DateTimeFormatter
    import org.apache.spark.sql.functions._
    
    val tempdf = Seq(Timestamp.valueOf(LocalDateTime.of(2021, 3, 8, 18, 0))).toDF("Date1")
    
    tempdf.withColumn("newDate", 
        to_date(
            concat_ws("-",
                year(add_months($"Date1",-1)),
                month(add_months($"Date1",-1)),
                lit(1)
            )
        )
    ).show()
    
    +-------------------+----------+
    |              Date1|   newDate|
    +-------------------+----------+
    |2021-03-08 18:00:00|2021-02-01|
    +-------------------+----------+
    

    更简洁的方法是使用trunc

    tempdf.withColumn("newDate", add_months(trunc($"Date1", "month"), -1)).show()
    +-------------------+----------+
    |              Date1|   newDate|
    +-------------------+----------+
    |2021-03-08 18:00:00|2021-02-01|
    +-------------------+----------+
    

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 2020-08-11
      相关资源
      最近更新 更多