Puis-je utiliser des macros avec PythonOperator? J'ai essayé de suivre, mais je n'ai pas pu obtenir le rendu des macros:
dag = DAG(
'temp',
default_args=default_args,
description='temp dag',
schedule_interval=timedelta(days=1))
def temp_def(a, b, **kwargs):
print '{{ds}}'
print '{{execution_date}}'
print 'a=%s, b=%s, kwargs=%s' % (str(a), str(b), str(kwargs))
ds = '{{ ds }}'
mm = '{{ execution_date }}'
t1 = PythonOperator(
task_id='temp_task',
python_callable=temp_def,
op_args=[mm , ds],
provide_context=False,
dag=dag)
Les macros ne sont traitées que pour les champs modèles. Pour que Jinja traite ce champ, étendez le PythonOperator
avec le vôtre.
class MyPythonOperator(PythonOperator):
template_fields = ('templates_dict','op_args')
J'ai ajouté 'templates_dict'
à la template_fields
parce que le PythonOperator
lui-même a ce champ modèle: PythonOperator
Vous devriez maintenant pouvoir utiliser une macro dans ce champ:
ds = '{{ ds }}'
mm = '{{ execution_date }}'
t1 = MyPythonOperator(
task_id='temp_task',
python_callable=temp_def,
op_args=[mm , ds],
provide_context=False,
dag=dag)
À mon avis, une manière plus native d'Airflow d'approcher cela serait d'utiliser le PythonOperator inclus et d'utiliser le provide_context=True
paramètre en tant que tel.
t1 = MyPythonOperator(
task_id='temp_task',
python_callable=temp_def,
provide_context=True,
dag=dag)
Vous avez maintenant accès à toutes les macros, métadonnées de flux d'air et paramètres de tâche dans le kwargs
de votre callable
def temp_def(**kwargs):
print 'ds={}, execution_date={}'.format((str(kwargs['ds']), str(kwargs['execution_date']))
Si vous aviez un params
personnalisé défini associé à la tâche, vous pouvez également y accéder via kwargs['params']