datetime列中的Spark(scala)更改日期

datetime列中的Spark(scala)更改日期,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我正在尝试做与上面答案类似的事情。我要走了 value replace不是java.sql.Timestamp的成员 val changeDay = udf((date:java.sql.Timestamp) => { val day = 1 date.replace(day=day) }) val df2 = df1.withColumn("newDateTime", changeDay($"datetime")) 我不知道这个java.sql.Timestamp对象可以使用哪

我正在尝试做与上面答案类似的事情。我要走了
value replace不是java.sql.Timestamp的成员

val changeDay = udf((date:java.sql.Timestamp) => {
  val day = 1
  date.replace(day=day)
})
val df2 = df1.withColumn("newDateTime", changeDay($"datetime"))

我不知道这个
java.sql.Timestamp
对象可以使用哪些函数。当我在谷歌上搜索时,看起来答案似乎与同一类型无关

所以这可能不是最好的方法,但这里有一种方法

val DateTimeString = date.toString()
val DTtime = DateTimeString.split(" ")(1)
DTday + " " + DTtime

您可以将
时间戳
转换为
java.time
,并通过
withDayOfMonth(day)
更改其
值,如下所示:

import java.sql.Timestamp
import org.apache.spark.sql.functions._
import spark.implicits._

val df = Seq(
  (1, Timestamp.valueOf("2019-03-07 12:30:00")),
  (2, Timestamp.valueOf("2019-04-08 09:00:00"))
).toDF("id", "ts")

def changeDay(day: Int) = udf{ (ts: Timestamp) =>
  import java.time.LocalDateTime
  val changedTS = ts.toLocalDateTime.withDayOfMonth(day)
  Timestamp.valueOf(changedTS)
}

df.withColumn("newTS", changeDay(1)($"ts")).show
// +---+-------------------+-------------------+
// | id|                 ts|              newTS|
// +---+-------------------+-------------------+
// |  1|2019-03-07 12:30:00|2019-03-01 12:30:00|
// |  2|2019-04-08 09:00:00|2019-04-01 09:00:00|
// +---+-------------------+-------------------+