我正在从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值。
答案 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 。该运算符仅根据上游任务的结果沿特定路径走。
引自非常好的阅读:https://medium.com/@guillaume_payen/use-conditional-tasks-with-apache-airflow-98bab35f1846 气流文档:http://airflow.apache.org/concepts.html?highlight=branch#branching。