到Postgres操作员的气流参数

时间:2019-08-09 08:36:39

标签: amazon-redshift airflow

我试图将执行日期作为运行时参数传递给postgres运算符

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

task = MyPostgresOperator(
  task_id='test_date',
  postgres_conn_id='redshift',
  sql="test_file.sql",
  parameters={'crunch_date':'{{ ds }}'},
  dag=dag
)

然后我尝试在sql查询中使用此参数来接受dag传递的值

select 
{{ crunch_date }} as test1,

dag正确发送了参数,但是查询只是采用空值而不是传递的执行日期。有没有办法让带有redshift的postgresql对此参数接受正确的值?

2 个答案:

答案 0 :(得分:0)

您可以在查询字符串中使用气流宏-需要将其传递给redshift。

示例:

PostgresOperator(task_id="run_on_redshift",
                 dag=dag,
                 postgres_conn_id=REDSHIFT_CONN_ID,
                 sql="""
                        UNLOAD ('select * from abc.xyz') TO 's3://path/{{ds}}/' iam_role 's3_iam_role' DELIMITER AS '^' ALLOWOVERWRITE addquotes ESCAPE HEADER parallel off;
                     """
                 )

答案 1 :(得分:0)

您将必须如下更新您的SQL查询:

select 
{{ ds }} as test1,

您将无法在其他模板字段中使用一个模板字段。如果要在任务中传递参数并在Jinja模板中使用它,请使用params参数。

更新

但是请注意,params不是模板字段。而且,如果您对其进行模板化,则不会像嵌套模板一样起作用。

task = MyPostgresOperator(
  task_id='test_date',
  postgres_conn_id='redshift',
  sql="test_file.sql",
  params={'textstring':'abc'},
  dag=dag
)

其中test_file.sql是:

select 
{{ params.textstring }} as test1,

https://medium.com/datareply/airflow-lesser-known-tips-tricks-and-best-practises-cf4d4a90f8f中检查第4点,以了解有关params的更多信息。