Spark Scala用今天的时间戳填充NA

UrV*_*Val 0 apache-spark apache-spark-sql

如何替换类型为timestamp的列中的所有空值?

我希望这会更容易,但是我似乎无法正确获取类型。我认为一个解决方案是将列转换为String,在字符串中填充今天的日期,然后重新转换为timestamp,但是,还有没有更优雅的解决方案?

val today = java.time.LocalDate.now()
var todayStamp = java.sql.Timestamp.valueOf(today.atStartOfDay());
df = df.na.fill(Map("expiration" -> todayStamp))
Run Code Online (Sandbox Code Playgroud)

结果是

java.lang.IllegalArgumentException: Unsupported value type java.sql.Timestamp
Run Code Online (Sandbox Code Playgroud)

使用今天也不起作用,并且使用unix_timestamp(string).cast("timestamp") 期望列而不是字符串。我想我可以在上面提到的“丑陋”方法中使用它。

稍后编辑:忘了提及,在timestamp列上将Int或String与df.na.fill方法一起使用也会导致错误:

org.apache.spark.sql.AnalysisException: cannot resolve 'coalesce(expiration, 0)' due to data type mismatch: input to function coalesce should all be the same type, but it's [timestamp, int];
Run Code Online (Sandbox Code Playgroud)

Dan*_*ula 5

您也可以使用结盟

import org.apache.spark.sql.functions._
df.withColumn("expiration", coalesce(col("expiration"), current_timestamp()))
Run Code Online (Sandbox Code Playgroud)

这是一个可重现的示例:

import org.apache.spark.sql.functions._

val df = Seq(
  Tuple1(None: Option[Timestamp]),
  Tuple1(Some(Timestamp.valueOf("2010-01-01 00:00:00")))
).toDF("expiration")

df.withColumn("expiration", coalesce(col("expiration"), current_timestamp())).show()
Run Code Online (Sandbox Code Playgroud)