Airflow 如何基于条件不在DAG中显示任务
我有一个DAG,里面有3个任务。我不希望基于条件在DAG运行中显示第二个任务(中间名称)。例如,如果middle_name_var=='false',我不想在DAG中显示middle_name任务。有没有办法优雅地实现这一点Airflow 如何基于条件不在DAG中显示任务,airflow,Airflow,我有一个DAG,里面有3个任务。我不希望基于条件在DAG运行中显示第二个任务(中间名称)。例如,如果middle_name_var=='false',我不想在DAG中显示middle_name任务。有没有办法优雅地实现这一点 from airflow.operators import PythonOperator from airflow.operators.python_operator import BranchPythonOperator from airflow.operators.du
from airflow.operators import PythonOperator
from airflow.operators.python_operator import BranchPythonOperator
from airflow.operators.dummy_operator import DummyOperator
from datetime import datetime, timedelta
from airflow.models import Variable
middle_name_var = Variable.get('middle_name')
default_args = {
'owner': 'test',
'depends_on_past': False,
'start_date': datetime(2018, 6, 18),
'email': ['tes@abc.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=1)
}
dag = DAG(
'name',
default_args=default_args,
schedule_interval="@once")
def first_name():
print('John')
def middle_name():
print('Smith')
def last_name():
print('Doe')
first_name_task = PythonOperator(
task_id='first_name',
provide_context=False,
python_callable=first_name,
dag=dag
)
middle_name_task = PythonOperator(
task_id='middle_name',
provide_context=False,
python_callable=middle_name,
dag=dag
)
last_name_task = PythonOperator(
task_id='last_name',
provide_context=False,
python_callable=last_name,
dag=dag
)
if middle_name_var == 'true':
first_name_task >> middle_name_task >>last_name_task
else:
first_name_task >> last_name_task
我的DAG与middle_name task类似……但我不希望基于middle_name_var的middle_name task,在本例中该变量设置为false
参考最后一组链接语句
# by the way i believe the comparison expression should be
# middle_name_var == True (boolean rather than string), but lets ignore it for now
if middle_name_var == 'true':
first_name_task >> middle_name_task >>last_name_task
else:
first_name_task >> last_name_task
让我问你:如果删除这些链接语句,会发生什么?任务会从DAG中消失吗
不完全是
链接只是在任务之间建立依赖关系。即使没有链接,你的任务仍然是DAG的一部分(就像你发布的截图) 这里有一个秘密:一项任务一旦你宣布就成为你的dag的一部分
middle_name_task = PythonOperator(
task_id='middle_name',
provide_context=False,
python_callable=middle_name,
dag=dag
)
无论您是否将该任务设置为其他任务的上游或下游,它都将继续“显示”在DAG中。在这方面引用
操作员不必立即分配给DAG(以前
dag是必需的参数)。但是,一旦操作员被分配到
DAG,它不能被转移或取消分配。DAG分配可以是
在创建运算符时,通过延迟
赋值,甚至从其他运算符推断
- Q那么您应该如何“不显示”任务 A只是不声明(实例化)它
- Q你会怎么做 只需将任务声明移动到if-else子句中即可
if middle_name_var == 'true':
middle_name_task = PythonOperator(
task_id='middle_name',
provide_context=False,
python_callable=middle_name,
dag=dag
)
first_name_task >> middle_name_task >>last_name_task
else:
first_name_task >> last_name_task