Spark:将含日期时间的Timestamp转换为DateType失败问题排查
问题分析与解决
错误点总结
- 未替换原字段:你仅执行了转换逻辑,但没有将转换后的结果赋值回DataFrame的
Date字段,原字段仍保留原始字符串类型,所以printSchema()显示类型未变,输出值也还是原格式。 - 代码冗余:
to_date函数本身返回的就是DateType,额外调用.cast(DateType)完全没必要。
正确实现方式
必须通过withColumn方法将转换结果覆盖原字段(或生成新字段),以下是两种可行写法:
写法1:直接用to_date解析字符串
import org.apache.spark.sql.functions.{col, to_date} // 覆盖原Date字段,将字符串直接转为DateType val dfUpdated = df.withColumn("Date", to_date(col("Date"), "yyyy-MM-dd'T'HH:mm:ss"))
写法2:先转Timestamp再转Date(可选)
如果一定要先转时间戳再转日期,也可以这么写(和写法1效果一致):
import org.apache.spark.sql.functions.{col, to_date, to_timestamp} val dfUpdated = df.withColumn("Date", to_date(to_timestamp(col("Date"), "yyyy-MM-dd'T'HH:mm:ss")))
验证结果
执行上述代码后,调用dfUpdated.printSchema()会显示:
|-- Date: date (nullable = true)
字段值也会变为你预期的yyyy-MM-dd格式(如2021-02-12)。
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

