我想使用执行日期作为我的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
)
但它不起作用。
答案 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 /'