【发布时间】:2021-09-09 08:54:58
【问题描述】:
是否有一个计划模式可以在一个月内运行 3 次 DAG - 每月的第 5 天、月末前 14 天和月末。
谢谢
【问题讨论】:
是否有一个计划模式可以在一个月内运行 3 次 DAG - 每月的第 5 天、月末前 14 天和月末。
谢谢
【问题讨论】:
另一个选项是在 Cron 表达式中指定日期。
参考这个answer,我们可以在月底使用L。但是,它无法确定月底前的 14 天。我不确定是否可以使用 14 日来表示最后两周。
建议的 schedule_interval 为 "0 0 5,14,L * *"。但由于 Airflow 将在每个周期结束时运行,执行日期将显示上个月的日期。并且您需要确保 start_date 超过一个月才能开始触发。
用 Python 解决第 14 天的问题,
import calendar
last_day = calendar.monthrange("{{ execution_date.year }}", "{{ execution_date.month }}")[1]
schedule_interval = f"0 0 5,{last_day - 14},L * *"
或将Pendulum 方法与execution_date 一起使用:
last_day = "{{ execution_date.days_in_month }}"
schedule_interval = f"0 0 5,{last_day - 14},{last_day} * *"
不要忘记在 DAG 中为 Airflow 2.1 或更高版本添加 render_template_as_native_obj=True,以使其输出为 Python 对象而不是字符串。如果它不起作用,则需要将其转换为 int。
参考cron format in Crontab.guru(那里不支持L字符,所以我用31作为占位符)
【讨论】:
我认为这里最好的解决方案是每天运行你的 DAG,然后检查 execution_date 是否符合你的条件。
Crontab 表达式只支持转发日。一个月的第5天,应该是'0 0 5 * *',但是倒退是不可能的。
【讨论】: