我有两个任务,一个是自定义运算符,其中有一个模板字段(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感到不舒服,我错过了一些基本的东西吗?任何帮助将不胜感激。
答案 0 :(得分:2)
,您可能需要在
行中执行某些操作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的运行。换句话说,作业实例一旦它所涵盖的时间段结束就会启动。