Airflow:将{{ds}}作为参数传递给PostgresOperator

时间:2017-06-13 13:52:38

标签: python scheduler airflow apache-airflow

我想使用执行日期作为我的sql文件的参数:

我试过

dt = '{{ ds }}'

s3_to_redshift = PostgresOperator(
    task_id='s3_to_redshift',
    postgres_conn_id='redshift',
    sql='s3_to_redshift.sql',
    params={'file': dt},
    dag=dag
)

但它不起作用。

2 个答案:

答案 0 :(得分:20)

dt = '{{ ds }}'

不能正常工作,因为Jinja(气流中使用的模板引擎)不会处理整个Dag定义文件。

对于每个Operator,Jinja将处理一些字段,这些字段是运算符本身的定义的一部分。

在这种情况下,如果像这样扩展params,则可以使parameters字段(实际上称为PostgresOperator,确保更改此字段)模板化:

class MyPostgresOperator(PostgresOperator):
    template_fields = ('sql','parameters')

现在你应该可以做到:

s3_to_redshift = MyPostgresOperator(
    task_id='s3_to_redshift',
    postgres_conn_id='redshift',
    sql='s3_to_redshift.sql',
    parameters={'file': '{{ ds }}'},
    dag=dag
)

答案 1 :(得分:0)

PostgresOperator / JDBCOperator继承自BaseOperator。
BaseOperator的输入参数之一是params:     self.params = params or {} # Available in templates!

因此,您应该能够使用它而无需创建新类:
(即使param不包含在template_fields中)      t1 = JdbcOperator( task_id='copy', sql='copy.sql', jdbc_conn_id='connection_name', params={'schema_name':'public'}, dag=dag )

SQL语句(copy.sql)可能类似于:      copy {{ params.schema_name }}.table_name from 's3://.../table_name.csv' iam_role 'arn:aws:iam::<acc_num>:role/<role_name>' csv IGNOREHEADER 1

注意:

copy.sql驻留在DAG所在的相同位置。

您可以在“ default_args”中定义“ template_searchpath”变量,并指定模板文件所在文件夹的绝对路径。
例如:'template_searchpath':'/ home / user / airflow / templates /'