Airflow 用于为运算符创建动态参数的气流宏

Airflow 用于为运算符创建动态参数的气流宏,airflow,Airflow,我想做的是使用dag_id和run_id作为S3中的路径的一部分,我希望获得数据,但我开始理解这些模板化的值仅应用于任务执行上下文 我是否可以向下面这样的操作员提供它们的值,以控制文件的去向 my_task = RedshiftToS3Transfer( task_id='my_task', schema='public', table='my_table', s3_bucket='bucket', s3_key='foo/bar/{{ dag_id }}/{{ run_id

我想做的是使用dag_id和run_id作为S3中的路径的一部分,我希望获得数据,但我开始理解这些模板化的值仅应用于任务执行上下文

我是否可以向下面这样的操作员提供它们的值,以控制文件的去向

my_task = RedshiftToS3Transfer(
  task_id='my_task',
  schema='public',
  table='my_table',
  s3_bucket='bucket',
  s3_key='foo/bar/{{ dag_id }}/{{ run_id }}',
  redshift_conn_id='MY_CONN',
  aws_conn_id='AWS_DEFAULT',
  dag=dag
)

这是一个由两部分组成的答案

第一部分: 如何获得模板化的
s3_键

推荐方法:

如果从导入运算符,代码将被模板化。这是因为提供者中的
redshiftotos3transfer
已将
s3\u键列为模板字段

不推荐的方法:(对气流>2.0无效)

从Airflow core导入操作符时,您需要编写一个自定义操作符,将
redshiftotos3transfer
包装为:

from airflow.operators.redshift_to_s3_operator import RedshiftToS3Transfer

class MyRedshiftToS3Transfer (RedshiftToS3Transfer):

    template_fields = ['s3_key']

my_task = MyRedshiftToS3Transfer(
  task_id='my_task',
  schema='public',
  table='my_table',
  s3_bucket='bucket',
  s3_key='foo/bar/{{ dag_id }}/{{ run_id }}',
  redshift_conn_id='MY_CONN',
  aws_conn_id='AWS_DEFAULT',
  dag=dag
)
这将给你:

第二部分: 如何选择模板化值。 正如您在第一部分中所看到的,输出不是真正的工作路径,因为它包含无效值。 我建议使用来自的task_instance_key_str,它是格式化为
{dag_id}{task_id}{ds_nodash}

因此,您可以在代码中使用它:

  s3_key='foo/bar/{{ task_instance_key_str }}'
这将给你:

这对每日DAG很好,但如果DAG以较小的间隔运行,则可以执行以下操作:

  s3_key='foo/bar/{{task.dag_id}}__{{task.task_id}}__{{ ts_nodash }}'
这将给你:

最后做了

class TemplatedRedshiftToS3Transfer(RedshiftToS3Transfer):
    template_fields = ['s3_key']

    @apply_defaults
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

要从redshiftotos3transfer创建一个新的派生类,它通过模板引擎从实例化传递
s3\u键
字段。我最终让它使用:```类templatedReshiftToS3Transfer(RedshiftToS3Transfer):template_字段=['s3_键]@apply_defaults def_uinit(self,*args,**kwargs):super()。u init_u(*args,**kwargs)“``你说redshiftotos3操作符已经有了template\u字段,但当我直接检查它时,
redshiftotos3transfer.template\u字段
它是空元组。使用Airflow 1.10.12 fyi,但从RsToS3中衍生出一个新的操作员,并将其作为模板现场工作