Amazon redshift Postgres操作员的气流参数
我试图将执行日期作为运行时参数传递给postgres操作符Amazon redshift Postgres操作员的气流参数,amazon-redshift,airflow,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':
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正确地发送参数,但是查询只是采用空值,而不是传递的执行日期。有没有办法让带红移的postgresql接受此参数的正确值?您可以使用查询字符串中的气流宏-需要将其传递给红移 例如:
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;
"""
)
您必须更新sql查询,如下所示:
选择
{{ds}}作为test1,
您将无法在另一个模板字段中使用一个模板字段。如果要在任务中传递参数并在Jinja模板中使用它,请使用params
参数
更新:
但请注意,params
不是模板化字段。如果对其进行模板化,它将不会呈现,因为嵌套模板化不起作用
task=MyPostgresOperator(
任务\u id='test\u date',
postgres_conn_id='redshift',
sql=“test\u file.sql”,
params={'textstring':'abc'},
dag=dag
)
其中test_file.sql
是:
选择
{{params.textstring}}作为test1,
查看中的第四点以了解有关
参数的更多信息它的红移@a_horse_,没有名称移除{ds}
@psychoCoder周围的空格我已经尝试过了,但不起作用。虽然dag正确发送参数,但我唯一的问题是sql文件无法识别参数。我知道我可以在sql查询中使用宏。但是我想做的不是在dag中编写整个SQL查询,而是在dag中只调用SQL文件,然后将参数从dag传递到该SQL文件。我不确定您是否理解我的问题。你给出的解决方案已经是我尝试过但失败了。我将给出另一个简单的例子:task=MyPostgresOperator(task_id='test_date',postgres_conn_id='redshift',sql=“test_file.sql”,parameters={'textstring':'abc'},dag=dag),这里textstring是参数名,abc是它的值,现在我想在sql文件中获取参数值:选择{{textstring}与test1一样,但文本字符串只是空的。非常感谢,您是救世主。这完全符合预期。这里的一个问题是,当传递字符串值时,解决方案可以完美地工作,但不能与测试文件“{params.crunchdate}”中的ds参数sql='ETL models/test_file.sql',params={crunchdate':'{ds}}'一起工作'作为test1,它给出了一个错误:psycopg2.DataError:类型时间戳的输入语法无效:“{{ds}”