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)
您也可以使用结盟:
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)
| 归档时间: |
|
| 查看次数: |
2830 次 |
| 最近记录: |