Dependencies 气流:创造和;通过XCOM传递表列表(不作为文件存储在驱动器上)并设置正确的依赖项?

Dependencies 气流:创造和;通过XCOM传递表列表(不作为文件存储在驱动器上)并设置正确的依赖项?,dependencies,task,airflow,apache-airflow-xcom,Dependencies,Task,Airflow,Apache Airflow Xcom,下面是我想要实现的预期流和依赖项设置: 开始==>创建表列表(仅在触发DAG时一次)==>读取并传递表名(通过XCOM)==>为列表中的每个表动态创建单个任务==>打印表名==>结束 下面是示例代码流: start = DummyOperator( task_id = 'start', dag=dag ) end = DummyOperator( task_id = 'end', dag=dag ) #create table

下面是我想要实现的预期流和依赖项设置:

开始==>创建表列表(仅在触发DAG时一次)==>读取并传递表名(通过XCOM)==>为列表中的每个表动态创建单个任务==>打印表名==>结束

下面是示例代码流:

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

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

#create table list:
def create_source_table_list(dsn, uid, pwd, exclude_table_list, **kwargs):
    try:
        cnxn = pyodbc.connect('DSN={};UID={};PWD={}'.format(dsn, uid, pwd))
        cursor=cnxn.cursor()
        tables_list = []
        for row in cursor.tables():
            tables_list.append(row.table_name)
        final_list = [ele for ele in tables_list if ele not in exclude_table_list]
    return final_list

create_table_list = PythonOperator(
                task_id = 'create_table_list',
                python_callable=create_source_table_list,
                provide_context=True,
                op_args=['DSNNAME','USERID', 'PASSWORD', ['TABLE1', 'TABLE2']], 
                dag=dag
)

#function for dynamic task generation 
def createDynamicTask(task_id, callableFunction, args):
    task = PythonOperator(
        task_id = task_id,
        provide_context=True,
        python_callable = eval(callableFunction),
        op_kwargs = args,
        xcom_push = True,
        email= ['xyz.com'],
        email_on_failure = True,
        email_on_retry = False,
        dag = dag
    )
    return task

#function to print table names
def print_tables(table_name,**kwargs):
    ti = kwargs['ti']
    ls = ti.xcom_pull(task_ids='create_table_list')
    print("The table name is: ", table_name)

for table in create_source_table_list(['DSNNAME','USERID', 'PASSWORD', ['TABLE1', 'TABLE2']]):

    print_table_names=createDynamicETL('{}-dynamic_task'.format(table),'print_tables',{'table_name':str(table)})

## set dependency
start >> create_table_list
create_table_list >> [print_table_names]
print_table_names >> end
然而,我在上述实施过程中面临以下问题/挑战/问题:

  • 表名未存储在XCOM中,希望避免将表列表存储在驱动器上的文件中
  • 数据库中的每个表都需要多个数据库调用
  • 任务依赖项集不正确-它仅获取并显示列表中最后一个表的依赖项,如下所示: 开始==>create_table_list==>{LAST_table_NAME in the list}==>end
  • 请说明我做错了什么


    谢谢

    因为列出表在计算上并不昂贵,所以我建议确定DAG之外的表列表。然后可以动态生成所需的任务

    这有点麻烦,但是如果你真的想把表列在一个气流运算符中,你可以考虑做如下:

    • 创建一个单独的(非计划的)DAG,其中包含一个更新表列表的任务,并将其存储在一个变量中
    • 使用
      TriggerDagRunOperator
      触发动态DAG,动态DAG包含基于该
      变量的内容的任务

    另外,我猜您使用的是MS SQL。您可以使用来查询数据库。

    您的方法很可能不起作用。虽然可以动态创建任务,但我还没有看到可以基于xcom动态创建任务。当xcom将被填充时,DAG运行已经开始,基于此添加或删除任务对我来说是个坏主意。