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
相关产品推荐
相关产品推荐

