J'ai écrit un DAG avec plusieurs PythonOperators
task1 = af_op.PythonOperator(task_id='Data_Extraction_Environment',
provide_context=True,
python_callable=Task1, dag=dag1)
def Task1(**kwargs):
return(kwargs['dag_run'].conf.get('file'))
De PythonOperator j'appelle la méthode "Task1". Cette méthode renvoie une valeur, cette valeur que je dois passer au prochain PythonOperator.Comment puis-je obtenir la valeur de la variable "task1" ou Comment puis-je obtenir la valeur renvoyée par la méthode Task1?
actualisé :
def Task1(**kwargs):
file_name = kwargs['dag_run'].conf.get[file]
task_instance = kwargs['task_instance']
task_instance.xcom_Push(key='file', value=file_name)
return file_name
t1 = PythonOperator(task_id = 'Task1',provide_context=True,python_callable=Task1,dag=dag)
t2 = BashOperator(
task_id='Moving_bucket',
bash_command='python /home/raw.py {{ task_instance.xcom_pull(task_ids='Task1',key='file') }} ',
dag=dag,
)
t2.set_upstream(t1)
Vous voudrez peut-être consulter le XCOM d'Airflow: https://airflow.Apache.org/concepts.html#xcoms
Si vous renvoyez une valeur à partir d'une fonction, cette valeur est stockée dans xcom. Dans votre cas, vous pouvez y accéder comme ça à partir d'un autre code Python:
task_instance = kwargs['task_instance']
task_instance.xcom_pull(task_ids='Task1')
ou dans un modèle comme celui-ci:
{{ task_instance.xcom_pull(task_ids='Task1') }}
Si vous souhaitez spécifier une clé, vous pouvez pousser dans XCOM (en étant dans une tâche):
task_instance = kwargs['task_instance']
task_instance.xcom_Push(key='the_key', value=my_str)
Plus tard, vous pouvez y accéder comme suit:
task_instance.xcom_pull(task_ids='my_task', key='the_key')
EDIT 1
Question de suivi: Au lieu d'utiliser la valeur dans une autre fonction, comment puis-je transmettre la valeur à un autre PythonOperator comme - "t2 =" BashOperator (task_id = 'Moving_bucket', bash_command = 'python /home/raw.py "% s" '% nom_fichier, dag = dag) "--- je veux accéder au nom_fichier qui est renvoyé par" Task1 ". Comment cela sera-t-il obtenu?
Tout d'abord, il me semble que la valeur est en fait pas passée à un autre PythonOperator
mais à un BashOperator
.
Deuxièmement, cela est déjà couvert dans ma réponse ci-dessus. Le champ bash_command
est un modèle (voir template_fields
dans la source: https://github.com/Apache/incubator-airflow/blob/master/airflow/operators/bash_operator.py ). Par conséquent, nous pouvons utiliser la version basée sur des modèles:
BashOperator(
task_id='Moving_bucket',
bash_command='python /home/raw.py {{ task_instance.xcom_pull(task_ids='Task1') }} ',
dag=dag,
)
EDIT 2
Explication: Airflow fonctionne comme ceci: il exécutera la tâche 1, remplira xcom puis exécutera la tâche suivante. Ainsi, pour que votre exemple fonctionne, vous devez d'abord exécuter Task1, puis exécuter Moving_bucket en aval de Task1.
Puisque vous utilisez une fonction de retour, vous pouvez également omettre le key='file'
de xcom_pull
et ne pas le définir manuellement dans la fonction.