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

