从另一个datetime字段spark scala dataframe创建一个新的日期列

bwleehnv  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(398)

我试图从Dataframe中的现有日期时间字段创建日期字段,但出现了错误

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格式),基本上回到上个月和第一年第二天

ldxq2e6h

ldxq2e6h1#

你不能打电话 LocalDateTime 在Spark柱上。您需要使用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|
+-------------------+----------+

相关问题