我想在我的dag中使用外部任务传感器中的execution_date_fn使其依赖于以前的实例(我不想使用depends_on_past参数)。有人可以告诉我如何使用'execution_date_fn'来获取同一dag的先前执行ID,从而不必在'execution_delta'中指定小时/分钟。不知道下面的方法“ prev_execution_date_1”是否正确。感谢任何帮助。
def prev_execution_date_1(**kwargs):
dr = self.get_dagrun(session=session)
previous_scheduled_date = dr.previous_schedule(self.execution_date)
return previous_scheduled_date
external_0 = ExternalTaskSensor(
task_id='Check_Previous_Instance',
external_task_id=None,
external_dag_id='dag_abc_1',
allowed_states=['success'],
execution_date_fn=prev_execution_date_1,
dag=dag
)
答案 0 :(得分:0)
execution_date_fn用于根据当前执行日期来计算所需的执行日期,如果未通过execution_delta,则在当前的稳定版本1.10中,将进行参数检查,并且最多接受两个参数,context [' execute_date']和上下文。而且上下文不包含会话,因此您无法在其中查询数据库。您可以尝试从airflow.settings导入Session,但这不是一个好主意。
一个例子是:
lambda dt: dt + timedelta(days=1)
如果您的调度程序间隔不经常更改,则使用execution_delta是相对简单的方法。
答案 1 :(得分:0)
我得到了答案,想到在这里发布它,可能会对某人有所帮助。
以下方法将根据我提到的条件返回执行ID。在这种方法中,您可以看到如果满足条件,它将在2天前的执行ID之前返回,否则将返回昨天的执行ID。
def prev_execution_dt(execution_date, **kwargs):
weekday=execution_date.strftime('%A')
print(weekday)
if weekday == "Thursday":
execution_dt_derived=execution_date - timedelta(hours=72)
print(execution_dt_derived)
else:
execution_dt_derived=execution_date - timedelta(hours=24)
print(execution_dt_derived)
return execution_dt_derived