Python 如何使用气流中的执行日期创建路径?

Python 如何使用气流中的执行日期创建路径?,python,airflow,Python,Airflow,我有以下气流dag: start_task = DummyOperator(task_id='start_task', dag=dag) gcs_export_uri_template = 'adstest/2018/08/31/*' update_bigquery = GoogleCloudStorageToBigQueryOperator( dag=dag, task_id='load_ads_to_BigQuery',

我有以下气流dag:

    start_task = DummyOperator(task_id='start_task', dag=dag)

    gcs_export_uri_template = 'adstest/2018/08/31/*'
    update_bigquery = GoogleCloudStorageToBigQueryOperator(
        dag=dag,
        task_id='load_ads_to_BigQuery',
        bucket=GCS_BUCKET_ID,
        destination_project_dataset_table=table_name_template,
        source_format='CSV',
        source_objects=[gcs_export_uri_template],
        schema_fields=dc(),
        create_disposition='CREATE_IF_NEEDED',
        write_disposition='WRITE_APPEND',
        skip_leading_rows = 1,
        google_cloud_storage_conn_id=CONNECTION_ID,
        bigquery_conn_id=CONNECTION_ID
    )

start_task >> update_bigquery
此dag将数据从
adstest/2018/08/31/*
加载到BigQuery,效果非常好

我想根据执行日期修改Dag以运行日期:

Execution date
Execution date - 1 days
Execution date - 2 days
示例:如果执行日期为
2018-09-02
我希望DAG转到:

Execution date : adstest/2018/09/02/*
Execution date - 1 days : adstest/2018/09/01/*
Execution date - 2 days : adstest/2018/08/31/*
我该怎么做

编辑: 这是我的更新代码:

for i in range(5, 0, -1):
    gcs_export_uri_template = ['''adstest/{{ macros.ds_format(macros.ds_add(ds, -{0}), '%Y-%m-%d', '%Y/%m/%d') }}/*'''.format(i)]
    update_bigquery = GoogleCloudStorageToBigQueryOperator(
        dag=dag,
        task_id='load_ads_to_BigQuery-{}'.format(i),
        bucket=GCS_BUCKET_ID,
        destination_project_dataset_table=table_name_template,
        source_format='CSV',
        source_objects=gcs_export_uri_template,
        schema_fields=dc(),
        create_disposition='CREATE_IF_NEEDED',
        write_disposition='WRITE_APPEND',
        skip_leading_rows=1,
        google_cloud_storage_conn_id=CONNECTION_ID,
        bigquery_conn_id=CONNECTION_ID
    )
    start_task >> update_bigquery
编辑2:

我的代码:

for i in range(5, 0, -1):
    gcs_export_uri_template = ['''adstest/{{ macros.ds_format(macros.ds_add(ds, -params.i), '%Y-%m-%d', '%Y/%m/%d') }}/*'''.format(i)]

    update_bigquery = GoogleCloudStorageToBigQueryOperator(
        dag=dag,
        task_id='load_ads_to_BigQuery-{}'.format(i),
        bucket=GCS_BUCKET_ID,
        destination_project_dataset_table=table_name_template,
        source_format='CSV',
        source_objects=gcs_export_uri_template,
        schema_fields=dc(),
        params={'i': i},
        create_disposition='CREATE_IF_NEEDED',
        write_disposition='WRITE_APPEND',
        skip_leading_rows=1,
        google_cloud_storage_conn_id=CONNECTION_ID,
        bigquery_conn_id=CONNECTION_ID
    )
模板:

代码给出了以下错误:

"Source URI must not contain the ',' character: gs://adstest/{ macros.ds_format(macros.ds_add(ds, -params.i), '%Y-%m-%d', '%Y/%m/%d') }/*">
您可以使用以下方法实现此目的:

for i in range(5, 0, -1):
    gcs_export_uri_template = ["adstest/{{ macros.ds_format(macros.ds_add(ds, -params.i), '%Y-%m-%d', '%Y/%m/%d') }}/*"]
    update_bigquery = GoogleCloudStorageToBigQueryOperator(
        dag=dag,
        task_id='load_ads_to_BigQuery-{}'.format(i),
        bucket=GCS_BUCKET_ID,
        destination_project_dataset_table=table_name_template,
        source_format='CSV',
        source_objects=gcs_export_uri_template,
        schema_fields=dc(),
        params={'i': i},
        create_disposition='CREATE_IF_NEEDED',
        write_disposition='WRITE_APPEND',
        skip_leading_rows=1,
        google_cloud_storage_conn_id=CONNECTION_ID,
        bigquery_conn_id=CONNECTION_ID
    )
    start_task >> update_bigquery
gcs\u导出\u uri\u模板=[
“adstest/{macros.ds_格式(ds,'%Y-%m-%d','%Y/%m/%d')}}/*”,
“adstest/{macros.ds_格式(上一个_-ds,'%Y-%m-%d','%Y/%m/%d')}/*”,
adstest/{macros.ds_格式(macros.ds_add(ds,-2),'%Y-%m-%d','%Y/%m/%d')}/*
]
更新_bigquery=GoogleCloudStorageToBigQueryOperator(
dag=dag,
task_id='load_ads_'u to_BigQuery',
bucket=GCS\u bucket\u ID,
目标\项目\数据集\表格=表格\名称\模板,
source_format='CSV',
source\u objects=gcs\u export\u uri\u模板,
schema_fields=dc(),
create_disposition='create_IF_NEEDED',
write_disposition='write_APPEND',
跳过前导行=1,
谷歌云存储连接id=连接id,
bigquery\u conn\u id=连接\u id
)
运行上述代码时,可以在Web UI中检查呈现的参数:


对于已编辑的评论

您需要在
params
参数中传递循环变量
i
的值,并将其作为
params.i
在字符串中使用,如下所示:

for i in range(5, 0, -1):
    gcs_export_uri_template = ["adstest/{{ macros.ds_format(macros.ds_add(ds, -params.i), '%Y-%m-%d', '%Y/%m/%d') }}/*"]
    update_bigquery = GoogleCloudStorageToBigQueryOperator(
        dag=dag,
        task_id='load_ads_to_BigQuery-{}'.format(i),
        bucket=GCS_BUCKET_ID,
        destination_project_dataset_table=table_name_template,
        source_format='CSV',
        source_objects=gcs_export_uri_template,
        schema_fields=dc(),
        params={'i': i},
        create_disposition='CREATE_IF_NEEDED',
        write_disposition='WRITE_APPEND',
        skip_leading_rows=1,
        google_cloud_storage_conn_id=CONNECTION_ID,
        bigquery_conn_id=CONNECTION_ID
    )
    start_task >> update_bigquery
您可以使用以下方法实现此目的:

for i in range(5, 0, -1):
    gcs_export_uri_template = ["adstest/{{ macros.ds_format(macros.ds_add(ds, -params.i), '%Y-%m-%d', '%Y/%m/%d') }}/*"]
    update_bigquery = GoogleCloudStorageToBigQueryOperator(
        dag=dag,
        task_id='load_ads_to_BigQuery-{}'.format(i),
        bucket=GCS_BUCKET_ID,
        destination_project_dataset_table=table_name_template,
        source_format='CSV',
        source_objects=gcs_export_uri_template,
        schema_fields=dc(),
        params={'i': i},
        create_disposition='CREATE_IF_NEEDED',
        write_disposition='WRITE_APPEND',
        skip_leading_rows=1,
        google_cloud_storage_conn_id=CONNECTION_ID,
        bigquery_conn_id=CONNECTION_ID
    )
    start_task >> update_bigquery
gcs\u导出\u uri\u模板=[
“adstest/{macros.ds_格式(ds,'%Y-%m-%d','%Y/%m/%d')}}/*”,
“adstest/{macros.ds_格式(上一个_-ds,'%Y-%m-%d','%Y/%m/%d')}/*”,
adstest/{macros.ds_格式(macros.ds_add(ds,-2),'%Y-%m-%d','%Y/%m/%d')}/*
]
更新_bigquery=GoogleCloudStorageToBigQueryOperator(
dag=dag,
task_id='load_ads_'u to_BigQuery',
bucket=GCS\u bucket\u ID,
目标\项目\数据集\表格=表格\名称\模板,
source_format='CSV',
source\u objects=gcs\u export\u uri\u模板,
schema_fields=dc(),
create_disposition='create_IF_NEEDED',
write_disposition='write_APPEND',
跳过前导行=1,
谷歌云存储连接id=连接id,
bigquery\u conn\u id=连接\u id
)
运行上述代码时,可以在Web UI中检查呈现的参数:


对于已编辑的评论

您需要在
params
参数中传递循环变量
i
的值,并将其作为
params.i
在字符串中使用,如下所示:

for i in range(5, 0, -1):
    gcs_export_uri_template = ["adstest/{{ macros.ds_format(macros.ds_add(ds, -params.i), '%Y-%m-%d', '%Y/%m/%d') }}/*"]
    update_bigquery = GoogleCloudStorageToBigQueryOperator(
        dag=dag,
        task_id='load_ads_to_BigQuery-{}'.format(i),
        bucket=GCS_BUCKET_ID,
        destination_project_dataset_table=table_name_template,
        source_format='CSV',
        source_objects=gcs_export_uri_template,
        schema_fields=dc(),
        params={'i': i},
        create_disposition='CREATE_IF_NEEDED',
        write_disposition='WRITE_APPEND',
        skip_leading_rows=1,
        google_cloud_storage_conn_id=CONNECTION_ID,
        bigquery_conn_id=CONNECTION_ID
    )
    start_task >> update_bigquery

假设我需要日期范围,并且我正在为范围(50,0,-1)中的
索引创建循环中的运算符:
我可以执行类似于
“adstest/{macros.ds_格式(macros.ds_add(ds),“%Y-%m-%d”,““%Y/%m/%d”)}/*”的操作吗
-替换?对于循环
索引
?我还有一个关于格式的问题。。你的代码给了我一位数的日期和月份。。。1而不是01,8而不是08正如我在屏幕截图中显示的那样,它为我提供了日期和月份的
01
。不太清楚您为什么没有得到它。@Programmer120为您的循环变量IssuedEasn添加的解决方案无效-“源URI不能包含“,”字符:gs://adstest/{macros.ds_格式(macros.ds_add(ds,-params.i),“%Y-%m-%d”,““%Y/%m/%d”)}/*”,假设我需要日期范围,并且我正在为范围内的
索引创建循环中的运算符(50,0,-1):
我能做一些类似于
的事情吗?“{macros.ds_格式(macros.ds_添加(ds,?),“%Y-%m-%d”,““%Y/%m/%d”)}/*”
-将?替换为循环
索引
?我还有一个格式问题。您的代码给我的日期和月份是1位数字…1而不是01、8和08,正如我在屏幕截图中显示的,它给我的日期和月份都是
01
。我不太确定为什么您得不到它。@Programmer120为您的循环变量添加了解决方案IssuedEasn不起作用-“源URI不能包含“,”字符:gs://adstest/{macros.ds_格式(macros.ds_添加(ds,-params.i),“%Y-%m-%d”,““%Y/%m/%d”)}/*”>