web-dev-qa-db-fra.com

Macros dans l'Airflow Python

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)
18
n1r44

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)
22
jhnclvr

À 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']

15
cr0atIAN