如何为Airflow任务传递可选命令行参数
解决方案
要实现让foo和woo参数可选,且未提供时仅保留--moo=1的需求,你可以按以下方式修改代码:
1. 调整DAG参数定义,允许参数为空
首先把原来的Param默认值改成None,并设置nullable=True,这样触发DAG时可以不填写这两个参数,不会触发校验错误:
params={ "foo": Param(None, type="string", nullable=True), "woo": Param(None, type="string", nullable=True) }
2. 动态生成Spark任务的参数列表
使用Jinja2的条件判断,只在参数有有效值时才将对应的命令行参数加入列表。这里提供两种简洁的写法:
写法一:列表推导式过滤空项
from airflow import DAG from airflow.providers.databricks.operators.databricks import DatabricksSubmitRunOperator from airflow.models.param import Param with DAG("some_dag", params={ "foo": Param(None, type="string", nullable=True), "woo": Param(None, type="string", nullable=True) }) as dag: some_task = DatabricksSubmitRunOperator( task_id="some_task", spark_jar_task={ 'main_class_name': 'com.some_app.SomeApp', 'parameters': [ item for item in [ f"--foo={{ params.foo }}" if params.foo else None, f"--woo={{ params.woo }}" if params.woo else None, "--moo=1" ] if item is not None ] } )
写法二:列表拼接(更直观)
from airflow import DAG from airflow.providers.databricks.operators.databricks import DatabricksSubmitRunOperator from airflow.models.param import Param with DAG("some_dag", params={ "foo": Param(None, type="string", nullable=True), "woo": Param(None, type="string", nullable=True) }) as dag: some_task = DatabricksSubmitRunOperator( task_id="some_task", spark_jar_task={ 'main_class_name': 'com.some_app.SomeApp', 'parameters': [ "--moo=1" ] + (["--foo={{ params.foo }}"] if params.foo else []) + (["--woo={{ params.woo }}"] if params.woo else []) } )
这两种写法的效果一致:当foo或woo未提供(或为空)时,对应的--foo/--woo参数会被跳过,最终parameters列表只会保留["--moo=1"];如果参数有值,则会把对应项加入列表。
内容的提问来源于stack exchange,提问作者Kombajn zbożowy
相关产品推荐
相关产品推荐

