![](/img/trans.png)
[英]Airflow scheduled dag_run time changes if DAG is run manuallly
[英]Using dag_run variables in airflow Dag
我正在嘗試使用氣流變量來確定是否執行任務。 我試過這個,但它不起作用:
if '{{ params.year }}' == '{{ params.message }}':
run_this = DummyOperator (
task_id = 'dummy_dag'
)
我希望能得到一些幫助讓它發揮作用。 還有在氣流中做這樣的事情的更好方法嗎?
我認為解決這個問題的一個好方法是使用BranchPythonOperator
根據提供的 DAG 參數動態分支。 考慮這個例子:
使用params
向 DAG 提供參數(也可以從 UI 完成),在本例中: {"enabled": True}
from airflow.decorators import dag, task
from airflow.utils.dates import days_ago
from airflow.operators.python import get_current_context, BranchPythonOperator
@dag(
default_args=default_args,
schedule_interval=None,
start_date=days_ago(1),
catchup=False,
tags=["example"],
params={"enabled": True},
)
def branch_from_dag_params():
def _print_enabled():
context = get_current_context()
enabled = context["params"].get("enabled", False)
print(f"Task id: {context['ti'].task_id}")
print(f"Enabled is: {enabled}")
@task
def task_a():
_print_enabled()
@task
def task_b():
_print_enabled()
定義一個可調用的BranchPythonOperator
,您將在其中執行條件並返回要執行的下一個任務。 您可以從**kwargs
訪問執行上下文變量。 另請記住,此運算符應返回單個task_id或task_id 列表以跟隨下游。 這些由此產生的任務應該總是直接在它的下游。
def _get_task_run(ti, **kwargs):
custom_param = kwargs["params"].get("enabled", False)
if custom_param:
return "task_a"
else:
return "task_b"
branch_task = BranchPythonOperator(
task_id="branch_task",
python_callable=_get_task_run,
)
task_a_exec = task_a()
task_b_exec = task_b()
branch_task >> [task_a_exec, task_b_exec]
結果是task_a被執行而task_b被跳過:
AIRFLOW_CTX_DAG_OWNER=airflow
AIRFLOW_CTX_DAG_ID=branch_from_dag_params
AIRFLOW_CTX_TASK_ID=task_a
Task id: task_a
Enabled is: True
如果這對你有用,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.