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

