EmptyOperator represents a task with no substantive work. In a branched DAG, it makes the convergence point explicit by joining alternative paths before downstream processing continues. section 6.2.2
Join alternative ERP branches
After selecting either the old or new ERP path, add a join task: from airflow.providers.standard.operators.empty import EmptyOperator join_branch = EmptyOperator( task_id="join_erp_branch", trigger_rule="none_failed" ) [clean_sales_old, clean_sales_new] >> join_branch join_branch >> join_datasets The join uses none_failed so execution can continue when one branch is skipped, while keeping the trigger-rule adjustment localized to the join. section 6.2.2
Figure 6.10 To make the branching structure clearer, you can add an extra join task after the branch, tying the lineages of the branch together before continuing with the rest of the DAG. This extra task has an added advantage: you don’t have to change trigger rules for other tasks in the DAG because you can set the required trigger rule on the join task. That is, you no longer need to set the trigger rule for the join_datasets task.
Diagram the branch lineages converging through an explicit join task before the shared downstream task. section 6.2.2
