web-dev-qa-db-fra.com

Airflow: passez {{ds}} en paramètre à PostgresOperator

je voudrais utiliser la date d'exécution comme paramètre dans mon fichier sql:

j'ai essayé

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
)

mais ça ne marche pas.

14
Omar14

dt = '{{ ds }}'

Ne fonctionne pas car Jinja (le moteur de modèle utilisé dans le flux d'air) ne traite pas l'intégralité du fichier de définition Dag.

Pour chaque Operator il y a des champs que Jinja traitera, qui font partie de la définition de l'opérateur lui-même.

Dans ce cas, vous pouvez créer le champ params (qui est en fait appelé parameters, assurez-vous de le modifier) ​​comme modèle si vous étendez le PostgresOperator comme ceci:

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

Vous devriez maintenant pouvoir faire:

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 héritent de BaseOperator.
L'un des paramètres d'entrée de BaseOperator est params: self.params = params or {} # Available in templates!

Ainsi, vous devriez pouvoir l'utiliser sans créer de nouvelle classe:
(même si params n'est pas inclus dans template_fields) t1 = JdbcOperator( task_id='copy', sql='copy.sql', jdbc_conn_id='connection_name', params={'schema_name':'public'}, dag=dag )

L'instruction SQL (copy.sql) peut ressembler à: copy {{ params.schema_name }}.table_name from 's3://.../table_name.csv' iam_role 'arn:aws:iam::<acc_num>:role/<role_name>' csv IGNOREHEADER 1

Remarque:

copy.sql réside au même emplacement que le DAG.
OU
vous pouvez définir la variable "template_searchpath" dans "default_args"
et spécifiez le chemin absolu vers le dossier où réside le fichier modèle.
Par exemple: 'template_searchpath': '/ home/user/airflow/templates /'

0
Dima Vlasenko