Dependencies 气流:创造和;通过XCOM传递表列表(不作为文件存储在驱动器上)并设置正确的依赖项?
下面是我想要实现的预期流和依赖项设置: 开始==>创建表列表(仅在触发DAG时一次)==>读取并传递表名(通过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
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
然而,我在上述实施过程中面临以下问题/挑战/问题:
谢谢 因为列出表在计算上并不昂贵,所以我建议确定DAG之外的表列表。然后可以动态生成所需的任务
这有点麻烦,但是如果你真的想把表列在一个气流运算符中,你可以考虑做如下:
- 创建一个单独的(非计划的)DAG,其中包含一个更新表列表的任务,并将其存储在一个变量中
- 使用
触发动态DAG,动态DAG包含基于该TriggerDagRunOperator
变量的内容的任务
另外,我猜您使用的是MS SQL。您可以使用来查询数据库。您的方法很可能不起作用。虽然可以动态创建任务,但我还没有看到可以基于xcom动态创建任务。当xcom将被填充时,DAG运行已经开始,基于此添加或删除任务对我来说是个坏主意。