如何基于触发它的任务更新任务变量

时间:2019-06-03 20:04:19

标签: airflow

我正在从API中提取数据并放入bigquery中。我想动态更改数据加载到的bigquery表。例如:应该将一个调用“列表”数据的api的任务添加到bigquery中的列表中。

目前,我有3个不同的dag。每个API调用一个。我想将它们压缩到一个DAG中,但是我不确定如何在我的load_to_bg任务中动态更改目标表。


#Config Variables

task1 = MailchimpToS3Operator(
        task_id='lists',
        mailchimp_conn_id = MC_CONN_ID,
        mailchimp_resource = 'lists',
        dag=dag
    )

task2 = MailchimpToS3Operator(
        task_id='camapaigns',
        mailchimp_conn_id = MC_CONN_ID,
        mailchimp_resource = 'campaigns'
        dag=dag
    )

task3 = MailchimpToS3Operator(
        task_id='memebers',
        mailchimp_conn_id = MC_CONN_ID,
        mailchimp_resource = 'members',
        dag=dag
    )

load_to_bq = GoogleCloudStorageToBigQueryOperator(
        task_id='gcp_to_bq',
        destination_project_dataset_table = "mailchimp.mailchimp_{}".format(mailchimp_resource),
        dag=dag
        )

[task1,task2,task3] >> load_to_bq

destination_project_dataset_table应该更新为包括触发它的任务中的mailchimp_resource值。

2 个答案:

答案 0 :(得分:0)

假设您具有预先定义的一组api,或者可以在运行时进行查询,则可以执行以下操作:

resources = [("resource name", "table to copy to")] # you can definitely call an api to get this resources list


with DAG("test_dag",schedule_interval="@daily") as dag:
    for res in resources:
        a = MailchimpToS3Operator(
            task_id=res[0],
            mailchimp_conn_id=MC_CONN_ID,
            mailchimp_resource=res[0],
            dag=dag
        )

        b = GoogleCloudStorageToBigQueryOperator(
            task_id='gcp_to_bq_'+res[0],
            destination_project_dataset_table = "mailchimp.mailchimp_"+res[1],
            dag=dag
            )

        a >> b

答案 1 :(得分:0)

我认为您是指Airflow中的“分支”。 一种方法是使用 BranchPythonOperator 。该运算符仅根据上游任务的结果沿特定路径走。

enter image description here

引自非常好的阅读:https://medium.com/@guillaume_payen/use-conditional-tasks-with-apache-airflow-98bab35f1846 气流文档:http://airflow.apache.org/concepts.html?highlight=branch#branching