气流:将{{params.hotel_ids}}作为参数传递给PostgresOperator

时间:2020-02-12 13:20:20

标签: airflow airflow-scheduler airflow-operator

我们可以在Airflow postgress参数中传递数组列表吗?

我正在尝试类似

Select hotel_name from hoteldetails where id in ({{ params.hotel_ids }});

在“ s3_to_redshift.sql”中。

下面是我的运算符::

s3_to_redshift = PostgresOperator(
    task_id='s3_to_redshift',
    postgres_conn_id='redshift',
    sql='s3_to_redshift.sql',
    params={'hotel_ids': [1,2,3]},
    dag=dag
)

1 个答案:

答案 0 :(得分:1)

可以,但是您必须担心参数将如何呈现。在这种情况下,您要传递数组并直接在SQL语句中呈现它。这将在SQL语句中打印[1, 2, 3],这当然不是有效的SQL。

Airflow使用Jinja渲染模板。为了获得正确的SQL语句,您可以在Jinja中使用for loops来渲染参数。 Airflow还支持添加您自己的功能以在Jinja中使用。这意味着您需要创建一个Airflow plugin。例如,您可以添加以下宏:

def render_list_sql(list):
  return ', '.join(list)

如果将此作为插件正确导入,则您的sql模板将变为以下内容:

Select hotel_name from hoteldetails where id in ({{ macros.render_list_sql(params.hotel_ids) }});