2017-10-09 14 views
2

Je n'arrive pas à faire fonctionner ça.Comment ajouter une variable de template dans le nom de fichier d'une tâche EmailOpérateur? (Airflow)

J'essaie d'envoyer quotidiennement un fichier donné, dont le nom est comme 'fichier _ {{ds_nodash}}. Csv'.

Le problème est que je ne peux pas sembler ajouter ce nom comme nom de fichier, car il semble qu'il ne peut pas être utilisé. Dans le texte de l'e-mail ou le sujet fonctionne parfaitement, pas sur le nom.

Voici DAG comme exemple:

local_file = 'file-{{ds_nodash}}.csv' 

send_stats_csv = EmailOperator(
    task_id='send-stats-csv', 
    to=['[email protected]'], 
    subject='Subject - {{ ds }}', 
    html_content='Here is the new file.', 
    files=[local_file], 
    dag=dag) 

Code d'erreur: Aucun fichier ou répertoire. U'file - {{}} ds_nodash csv »

Si je l'écris littéralement , avec sa date donnée, cela fonctionne parfaitement.

Où est-ce que je me trompe? Comment dois-je m'y prendre?

Toute aide serait appréciée.

Merci.

P.D. Copier le paste à partir de la documentation d'airflow - "Le moteur Airflow transmet par défaut quelques variables qui sont accessibles dans tous les templates". Si j'ai bien compris, ces variables sont accessibles en exécution, donc si j'exécute le dag, le fichier devrait être trouvé correctement? J'ai essayé à la fois de tester la tâche ou de remplir le dag sans succès.

Répondre

1

Les opérateurs de flux d'air définissent quels champs sont des champs de modèle. Pour EmailOperator, seuls les champs subject et html_content sont définis en tant que modèles.

class EmailOperator(BaseOperator): 
    ... 
    template_fields = ('subject', 'html_content') 
    template_ext = ('.html',) 

Voir: https://airflow.incubator.apache.org/_modules/email_operator.html

Depuis la page de Airflow Gotcha (https://gtoonstra.github.io/etl-with-airflow/gotchas.html)

Tous les paramètres opérateurs sont basés sur des modèles, de sorte que vous ne pouvez pas utiliser des modèles Jinja partout. Les modèles Jinja ne fonctionnent que pour les champs opérateurs où il est inscrit dans les template_fields ...

Pour que cela fonctionne, vous devez obtenir une nouvelle classe de EmailOperator et ajouter configurons le tableau des fichiers.

+0

Génial, donc je suppose que faire un nouvel emailOperator et prolonger celui existant fonctionnera, non? Merci!!! :) bien expliqué. –

0

Eh bien, juste un essai, je vois ds_nodash est une variable de modèle. vous devez probablement donner des espaces avant et après 'ds_nodash', ce sera quelque chose qui ressemble à: 'file-{{ ds_nodash }}.csv'