You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark Scala中to_timestamp()抛出异常未返回null问题咨询

问题原因与解决方案

核心问题

你遇到的异常源于两点:

  1. 格式字符串与输入日期不匹配:输入'17-08-01'是两位年份格式,你却使用了四位年份的格式'yyyy-MM-dd',正确对应格式应为'yy-MM-dd'。
  2. Spark默认启用ANSI模式(spark.sql.ansi.enabled=true),该模式下日期解析失败会抛出异常,而非返回null——文档描述的返回null行为,基于的是ANSI模式关闭的场景。

解决方案

方案1:修正格式字符串匹配输入

将格式改为与输入匹配的'yy-MM-dd',代码如下:

import org.apache.spark.sql.functions.{col, to_timestamp}
val df1 = Seq(("abc", "17-08-01")).toDF("id", "eventTime")
val df2 = df1.withColumn("eventTime1", to_timestamp(col("eventTime"), "yy-MM-dd"))
df2.show()

执行后会正常解析出2017-08-01 00:00:00。

方案2:关闭ANSI模式以返回null

如果需要保留原格式字符串(比如输入中存在多种格式的日期),可以关闭ANSI模式,让解析失败时返回null:

// 初始化SparkSession时配置
val spark = SparkSession.builder()
  .appName("TestToTimestamp")
  .config("spark.sql.ansi.enabled", "false")
  .getOrCreate()

// 执行原代码
import org.apache.spark.sql.functions.{col, to_timestamp}
val df1 = Seq(("abc", "17-08-01")).toDF("id", "eventTime")
val df2 = df1.withColumn("eventTime1", to_timestamp(col("eventTime"), "yyyy-MM-dd"))
df2.show()

此时eventTime1列会返回null,符合文档描述的行为。

补充说明

Spark的ANSI模式启用时,会严格遵循ANSI SQL标准,对日期/时间解析失败这类非法操作抛出异常;关闭模式后则会返回null,这也是文档中默认行为的前提。

内容的提问来源于stack exchange,提问作者PDerp15

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:30:24