2017-10-09 60 views
2

我似乎无法得到这个工作。如何在EmailOperator任务的文件名中添加模板变量? (气流)

我想每天发送一个给定的文件,其名称类似于'file _ {{ds_nodash}}。csv'。

问题是,我似乎无法将此名称添加为文件名,因为它似乎无法使用。在电子邮件或主题的文本完美,而不是名称。

这里是DAG作为一个例子:

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) 

错误代码: 没有这样的文件或目录:u'file - {{ds_nodash}} CSV”

如果我写它的字面,在给定的日期,它的工作完美无瑕。

我在哪里错了?我应该怎么做呢?

任何帮助,将不胜感激。

谢谢。

P.D.从airflow的文档复制粘贴 - “Airflow引擎默认传递一些可在所有模板中访问的变量”。 https://airflow.incubator.apache.org/code.html

如果我理解正确,这些变量可以在执行中访问,所以如果我正在执行dag,应该找到该文件是正确的?我已经尝试过测试任务或者回填DAG,但没有成功。

回答

1

气流操作符定义了什么字段是模板字段。对于EmailOperator,只有主题和html_content字段被设置为模板。

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

参见:https://airflow.incubator.apache.org/_modules/email_operator.html

从气流疑难杂症的页面(https://gtoonstra.github.io/etl-with-airflow/gotchas.html

不在运营商所有参数模板,所以你不能使用神社模板无处不在。该神社的模板只为它在template_fields的上市运营商在这些领域的工作...

为了得到这个工作,你就必须获得来自EmailOperator一个新的类,并在模板中添加对文件阵列。

+0

真棒,所以我想做一个新的emailOperator和扩展现有的将工作,对不对?谢谢!!! :)很好地解释。 –

0

嗯,只是一个尝试我看ds_nodash是一个模板变量。可能你需要在'ds_nodash'之前和之后给出空格,它会是这样的:'file-{{ ds_nodash }}.csv'