Airflow 用于为运算符创建动态参数的气流宏
我想做的是使用dag_id和run_id作为S3中的路径的一部分,我希望获得数据,但我开始理解这些模板化的值仅应用于任务执行上下文 我是否可以向下面这样的操作员提供它们的值,以控制文件的去向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
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中衍生出一个新的操作员,并将其作为模板现场工作