气流:从上游任务访问模板字段

时间:2018-05-09 05:50:49

标签: python python-3.x jinja2 airflow

我有两个任务,一个是自定义运算符,其中有一个模板字段(snapshot_date_str),它将在“xcom”中设置字段,另一个运算符为S3Sensor和{ {1}}需要在第一个任务中设置的模板字段。

Dag定义:

bucket_key

我的自定义SNAPSHOT_DATE = datetime.now().date() S3_BUCKET = 'test-s3' TENANT = 'test' dag = DAG('template_fields_dag', default_args=default_args, schedule_interval='@hourly', concurrency=1, catchup=False) t1 = ContextInitOperator(task_id='set_context', snapshot_date=SNAPSHOT_DATE, tenant=TENANT, dag=dag) file_task = S3KeySensor(task_id="s3_file_sensor", aws_conn_id='s3_connection', bucket_key='test/{{ snapshot_date_str }}/abc.csv', bucket_name=S3_BUCKET, wildcard_match=True, poke_interval=10, timeout=60, dag=dag) t1 >> file_task 在xcom中设置了模板字段ContextInitOperator

snapshot_date_str

class ContextInitOperator(BaseOperator): template_fields = ('snapshot_date_str',) @apply_defaults def __init__( self, snapshot_date, *args, **kwargs): super(ContextInitOperator, self).__init__(*args, **kwargs) self.snapshot_date_str = snapshot_date.strftime('%Y-%m-%d') def execute(self, context): context['task_instance'].xcom_push(key='snapshot_date_str', value=self.snapshot_date_str) 需要路径中的bucket_key

我对Python和Airflow感到不舒服,我错过了一些基本的东西吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

来自documentation

,您可能需要在

行中执行某些操作
bucket_key="test/{{ task_instance.xcom_pull(task_ids='set_context', key='snapshot_date_str') }}/abc.csv"

答案 1 :(得分:1)

如果这只是为了获取格式化日期,Airflow可以帮助您。根据您的需要,您可以使用以下预定义变量:

bucket_key='test/{{ ds }}/abc.csv',

今天,

bucket_key='test/{{ yesterday_ds }}/abc.csv',

昨天和

bucket_key='test/{{ tomorrow_ds }}/abc.csv',

明天。在此处查看所有可用的宏:https://airflow.apache.org/code.html#macros

这意味着您的ContextInitOperator可以被删除。

bucket_key也是一个模板化字段,可以在源文件(https://airflow.incubator.apache.org/_modules/airflow/operators/sensors.html)中看到,因此使用Jinja变量将起作用。

Airflow中的日期处理方式略有不同,因此您可能需要尝试获得所需的结果(来自https://airflow.incubator.apache.org/scheduler.html):

  

请注意,如果您在一天的schedule_interval上运行DAG,则会在2016-01-01T23:59之后不久触发标记为2016-01-01的运行。换句话说,作业实例一旦它所涵盖的时间段结束就会启动。