#dataframe #scala #apache-spark #date #apache-spark-sql
#фрейм данных #scala #apache-искра #Дата #apache-spark-sql
Вопрос:
Я использую фреймы данных Spark. У меня есть вариант использования, когда мне нужно увеличить дату на единицу. Если добавочная дата приходится на выходные, то мне нужно увеличить ее до следующей недели/рабочего дня.
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", date_add(col("some_date"),1))
Следующий рабочий день должен быть в следующий будний день, а не в выходные. Как это сделать?
Комментарии:
1. Суббота-рабочий день? А как насчет праздников, в какой стране?
2. Только в выходные , то есть в субботу и воскресенье , он должен перейти на понедельник.
Ответ №1:
Вы можете использовать dayofweek
, чтобы получить номер дня недели и добавить 2, если день-суббота, или добавить 3, если день-пятница.
val day = dayofweek(col("some_date")) val nextworkday = col("some_date") when(day gt; 5, -day 9).otherwise(1) 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("some_date", col("some_date").cast("date")) .withColumn("nextworking_day", nextworkday) df.show() ----- ---------- ---------- --------------- | id| some_date|item_value|nextworking_day| ----- ---------- ---------- --------------- |50312|2021-12-01| 0.9992019| 2021-12-02| |50312|2021-12-02|0.20171201| 2021-12-03| |50312|2021-12-03| 2.9992019| 2021-12-06| ----- ---------- ---------- ---------------
Ответ №2:
Написание udf для проверки дня должно решить проблему Ниже приведен пример кода, запущенного в pyspark, не содержит кода для праздников, но вы можете создать список или перечисление и добавить условие в зависимости от вашего региона
import pyspark.sql.functions as f from pyspark.sql.types import TimestampType from datetime import datetime, timedelta @f.udf(returnType=TimestampType()) def get_convert_date_udf(date_column): datetime_object = datetime.strptime(date_column, "%Y-%m-%d") new_datetime_object = datetime_object timedelta(days=1) day = new_datetime_object.strftime("%A") if day == "Sunday": new_datetime_object = timedelta(days=1) elif day == "Saturday": new_datetime_object = timedelta(days=2) return new_datetime_object df = df.withColumn("next_working_date", get_convert_date_udf(f.col("some_date")))