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

如何在Spark3中获取Spark2版本的add_months函数行为

Spark 2.x迁移至3.x的add_months函数兼容问题

背景

我们正在将大规模代码库从Spark 2.x迁移至Spark 3.x,为实现增量迁移,已设置部分legacy配置保证与Spark 2.x行为一致,但经查实add_months函数没有对应的"legacy"兼容模式。

版本行为差异

根据Spark 3迁移文档说明:

Spark 3.0中,若原始日期为当月最后一天,add_months函数不会将结果调整为目标月最后一天,例如执行select add_months(DATE'2019-02-28', 1)返回2019-03-28;而Spark 2.4及更低版本中,原始日期为月末时会自动调整结果,相同输入加1个月会返回2019-03-31。

疑问

最初计划不改动上层业务代码实现行为兼容,最直接的方案是编写函数包装层,在此之前我们想确认Spark 3中是否存在相关配置可直接还原Spark 2版本的add_months行为。

最终解决方案

经核查,Spark 3官方未提供对应兼容配置,最终我们在Scala Spark 3.x中实现了add_months的包装函数,代码如下:

object functions {
  def add_months(startDate: Column, numMonths: Int): Column = add_months(startDate, lit(numMonths))
  def add_months(startDate: Column, numMonths: Column): Column = {
    val addedMonthsSpark   = add_months_spark(startDate, numMonths)
    val startDateIsLastDay = last_day(startDate) === startDate
    when(startDateIsLastDay, last_day(addedMonthsSpark)).otherwise(addedMonthsSpark)
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:24:04