web-dev-qa-db-ja.com

Airflow:{{ds}}をパラメーターとしてPostgresOperatorに渡します

私は私の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
)

しかし、それは機能しません。

14
Omar14

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
)
27
jhnclvr

PostgresOperator/JDBCOperatorはBaseOperatorから継承します。
BaseOperatorの入力パラメーターの1つはparamsです:_self.params = params or {} # Available in templates!_

したがって、新しいクラスを作成せずにそれを使用できるはずです。
(paramsが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 /'

0
Dima Vlasenko