如何从气流中的Python Operator返回列表并将其用作dags中后续任务的参数

时间:2018-11-05 17:12:04

标签: python apache airflow

我有3个任务要在同一dag中运行。当Task1返回字典task2和task3的列表时,尝试使用结果返回一个字典元素 任务1。

def get_list():
    ....
    return listOfDict

def parse_1(example_dict):
    ...

def parse_2(example_dict):
    ...

dag = DAG('dagexample', default_args=default_args)
data_list = PythonOperator(
task_id='get_lists',
python_callable=get_list,
dag=dag)
for data in data_list:
    sub_task1 = PythonOperator(
        task_id='data_parse1' + data['id'],
        python_callable=parse_1,
        op_kwargs={'dataObject': data},
        dag=dag,
     )
    sub_task2 = PythonOperator(
        task_id='data_parse2' + data['id'],
        python_callable=parse_2,
        op_kwargs={'dataObject': data},
        dag=dag,
     )

2 个答案:

答案 0 :(得分:0)

您可以使用XComs,因为它们是为任务间通信而设计的。如果您的字典很大,那么我建议将其存储为csv文件。 通常,Airflow中的任务不会在它们之间共享数据,因此XCom是一种实现它们的方法,但仅限于少量数据。

答案 1 :(得分:0)

您应该使用XCom在不同任务之间传递变量/消息。看一下this示例:https://github.com/apache/incubator-airflow/blob/master/airflow/example_dags/example_xcom.py

对于您的情况,应该类似于以下内容:

default_args = {
    'owner': 'airflow',
    'start_date': airflow.utils.dates.days_ago(2),
    'provide_context': True, # This is needed
}


def get_list():
    ....
    return listOfDict

def parse_1(**kwargs):
    ti = kwargs['ti']

    # get listOfDict
    v1 = ti.xcom_pull(key=None, task_ids='get_lists')

    # You can now use this v1 dictionary as a normal python dict
    ...

def parse_2(**kwargs):
    ti = kwargs['ti']

    # get listOfDict
    v1 = ti.xcom_pull(key=None, task_ids='get_lists')
    ...

dag = DAG('dagexample', default_args=default_args)
data_list = PythonOperator(
task_id='get_lists',
python_callable=get_list,
dag=dag)
for data in data_list:
    sub_task1 = PythonOperator(
        task_id='data_parse1' + data['id'],
        python_callable=parse_1,
        op_kwargs={'dataObject': data},
        dag=dag,
     )
    sub_task2 = PythonOperator(
        task_id='data_parse2' + data['id'],
        python_callable=parse_2,
        op_kwargs={'dataObject': data},
        dag=dag,
     )