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

Spark DataFrame如何实现日期加1并自动跳过周末取下一工作日

Spark DataFrame计算下一工作日实现方案

方案1:使用内置日期函数(无UDF,性能更优)

核心逻辑利用Spark内置dayofweek函数判断星期,规则为:dayofweek返回值1对应周日、2对应周一...7对应周六,根据加1后的日期星期数做顺延:

  • 加1后为周六:额外再加2天到周一
  • 加1后为周日:额外再加1天到周一
  • 其余情况直接使用加1后的日期

实现代码:

import org.apache.spark.sql.functions._

val df = Seq(
  ("50312", "2021-12-01", "0.9992019"),
  ("50312", "2021-12-02", "0.20171201"),
  ("50312", "2021-12-03", "2.9992019")
).toDF("id","some_date","item_value")
.withColumn("next_day_temp", date_add(col("some_date"),1))
.withColumn("nextworking_day", 
  when(dayofweek(col("next_day_temp")) === 7, date_add(col("next_day_temp"),2))
  .when(dayofweek(col("next_day_temp")) === 1, date_add(col("next_day_temp"),1))
  .otherwise(col("next_day_temp"))
)
.drop("next_day_temp")

方案2:自定义UDF(方便后续扩展节假日规则)

如果后续需要叠加法定节假日排除逻辑,用UDF实现灵活性更高:

import java.time.LocalDate
import java.time.DayOfWeek
import org.apache.spark.sql.functions.udf

val getNextWorkingDay = udf { dateStr: String =>
  var currentDate = LocalDate.parse(dateStr).plusDays(1)
  // 跳过周末,需要扩展节假日的话可在此处新增判断逻辑
  while (currentDate.getDayOfWeek == DayOfWeek.SATURDAY || currentDate.getDayOfWeek == DayOfWeek.SUNDAY) {
    currentDate = currentDate.plusDays(1)
  }
  currentDate.toString
}

// 调用UDF实现
val df = Seq(
  ("50312", "2021-12-01", "0.9992019"),
  ("50312", "2021-12-02", "0.20171201"),
  ("50312", "2021-12-03", "2.9992019")
).toDF("id","some_date","item_value")
.withColumn("nextworking_day", getNextWorkingDay(col("some_date")))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:24:06