问题:Airflow的execution_date
被定义为两次运行之间的开始。例如,按周计划运行的DAG将在 2018-01-08 T11:00:00 上运行,但execution_date
将 2018-01-01 T11: 1点
目标:我每周收到一次文件,文件名是文件日期。为了识别文件,我想使用Airflow的execution_date
。但我似乎无法找到一种方法来使用运行日期,而不是使用最早的execution_date
一段时间。
可能的解决方案:
execution_date
。类似于:context['execution_date'] + timedelta(days=7)
。这看起来很糟糕。ShortCircuitOperator
,如果execution_date
不是预期日期,请退出。欢迎所有建议或建议。这是一个细微的问题,但导致我的ETL管道出现一些问题。
答案 0 :(得分:2)
另一种可能的解决方案?
我认为使用execution_date + timedelta(days = 7)有点hacky,intead使用execution_date + schedule_interval,这样如果间隔发生变化则不应该是任何问题(我为我的一个DAGS做这个) )。如果您使用的是较新的气流版本,那么您可以使用更好的next_execution_date。
答案 1 :(得分:2)
我正在使用宏解决此问题。
此功能(用于宏)也可以处理手动触发。
def weekly_today(execution_date, run_id, years=0, months=0, days=0, fmt="%Y%m%d"):
d = pendulum.instance(execution_date)
if run_id.startswith('scheduled_'):
d = d.add(days=7)
return d.add(years=years, months=months, days=days).strftime(fmt)
此功能应作为user_defined_macros
添加到DAG中
dag = DAG(
dag_id='test',
start_date=timezone.datetime(2019, 6, 24, 6),
schedule_interval=timedelta(days=7),
user_defined_macros={
'weekly_today': weekly_today
},
)
我需要设置从1年前到今天的数据范围。 这是示例宏用法。
from_macro = '{{ weekly_today(execution_date, run_id, years=-1) }}'
to_macro = '{{ weekly_today(execution_date, run_id) }}'
命名错误..但是可以。