Условное выражение задания Cron для выполнения задачи раз в две недели и ежедневно

#cron #airflow-scheduler

Вопрос:

Мне нужно выполнить 2 задачи при следующих условиях

  1. 1-е задание будет выполняться каждый альтернативный четверг в 3 часа ночи
  2. 2-е задание будет выполняться каждый день в 12 часов утра, за исключением дней, когда будет выполняться 1-е задание.

Я новичок в выражениях заданий cron, но пробовал несколько подходов. Я использую Spark, Scala для создания задач и Airflow для планирования задачи.

 schedule_interval= '0 0 3 1-5,15-19,29-31 * THU'
 

Я попробовал приведенное выше выражение для первой задачи в Airflow, но оно не сработает, если альтернативный четверг произойдет 6-14, 20-28, например, в январе 2022 года Четверги будут 6, 13, 20 и 27 числа.
Другая проблема возникнет, например, если альтернативный четверг наступит между 29-31, а следующий четверг наступит между 1-5, работа будет выполняться в течение 2 последовательных четвергов.

Ответ №1:

Я решил вышеуказанный вариант использования, используя приведенный ниже фрагмент кода

 def is_alternate_thursday(starting_day, date_to_check):
    set_day = THURSDAY

    if (date_to_check < starting_day) or (date_to_check.weekday() != set_day):
        return False

    base_week = starting_day.isocalendar()[1]
    checked_week = date_to_check.isocalendar()[1]

    return (checked_week - base_week) % 2 == 0
 

Основываясь на флаге, теперь мы можем запустить задачу.