airflow docs说:You can use Jinja templating with every parameter that is marked as “templated” in the documentation
。有意义的是,气流世界中的特定参数(例如PythonOperator
的某些参数)会自动通过气流进行模拟。我想知道什么是最好的/正确的方法来获得非气流变量来模板化。我的具体用例类似于:
from airflow import DAG from airflow.operators.python_operator import PythonOperator from somewhere import export_votes_data, export_queries_data from elsewhere import ApiCaucus, ApiQueries dag = DAG('export_training_data', description='Export training data for all active orgs to GCS', schedule_interval=None, start_date=datetime(2018, 3, 26), catchup=False) HOST = "http://api-00a.dev0.solvvy.co" BUCKET = "gcs://my-bucket-name/{{ ds }}/" # I'd like this to get templated votes_api = ApiCaucus.get_votes_api(HOST) queries_api = ApiQueries.get_queries_api(HOST) export_votes = PythonOperator(task_id="export_votes", python_callable=export_votes_data, op_args=[BUCKET, votes_api], dag=dag) export_queries = PythonOperator(task_id="export_queries", python_callable=export_query_data, op_args=[BUCKET, queries_api, export_solutions.task_id], dag=dag, provide_context=True)
答案 0 :(得分:1)
provide_context
的{{1}}参数将传递用于模板的参数。来自the documentation:
provide_context ( bool ) - 如果设置为true,Airflow将通过一组 可以在函数中使用的关键字参数。这套 kwargs完全对应于你在jinja模板中可以使用的内容。 为此,您需要在函数头中定义** kwargs。
通过提供给callable的上下文,然后可以在函数中进行插值:
PythonOperator
答案 1 :(得分:1)
操作员的内部方法(执行/执行前/执行后,以及可以获取气流context
的任何地方):
BUCKET = "gcs://my-bucket-name/{{ ds }}/" # I'd like this to get templated
jinja_context = context['ti'].get_template_context()
rendered_content = self.render_template('', BUCKET, jinja_context)