外部任务传感器execution_date_fn

时间:2020-07-22 13:05:37

标签: dependencies task airflow sensors directed-acyclic-graphs

我想在我的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
    )

2 个答案:

答案 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