Spark Scala中to_timestamp()抛出异常未返回null问题咨询
问题原因与解决方案
核心问题
你遇到的异常源于两点:
- 格式字符串与输入日期不匹配:输入
'17-08-01'是两位年份格式,你却使用了四位年份的格式'yyyy-MM-dd',正确对应格式应为'yy-MM-dd'。 - 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
相关产品推荐
相关产品推荐

