私は私の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
)
しかし、それは機能しません。
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
)
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 /'