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

Spark中仅含年月的字符串转DateType异常,如何正确处理?

Spark年月日期转换问题

给定仅含年月的日期字符串:

03.2020

我用这段代码尝试转成DateType:

to_timestamp(col("Date"), "MM.yyyy").cast(DateType)

结果却得到:

2017-03-01

不仅多了日部分“01”,年月顺序还不对,我想要的是03.2020格式的结果。

后来试了date_format函数:

date_format(col("Date"), "MM.yyyy")

结果返回null,到底哪里错了?


问题原因与解决办法

1. to_timestamp + cast(DateType)的问题

Spark的DateType是完整日期类型,必须包含年、月、日三个字段,所以只传年月的时候,Spark会自动补全日为01,这是日期类型的硬性要求——不存在只有年月的DateType。

你看到的2017-03-01大概率是测试时的笔误,正常解析03.2020应该得到2020-03-01,这是DateType的标准展示格式(yyyy-MM-dd),而你想要的03.2020是字符串格式,不是日期类型本身的输出。

2. date_format返回null的原因

date_format的输入必须是日期/时间类型,但你传入的col("Date")是原始字符串,函数无法识别,所以返回null。

正确处理方式

根据你的需求分两种情况:

  • 如果只是要处理字符串格式(比如保持MM.yyyy),直接操作字符串就行,不用转日期类型。
  • 如果需要转成日期类型做计算,之后再转成你要的字符串格式:
// 先把字符串转成DateType(自动补全日为01)
val dfWithDate = df.withColumn("date_col", to_timestamp(col("Date"), "MM.yyyy").cast(DateType))

// 再把日期类型转成你要的MM.yyyy字符串格式
val dfResult = dfWithDate.withColumn("formatted_date", date_format(col("date_col"), "MM.yyyy"))

这样formatted_date列就会输出03.2020。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:22:48