簡體   English   中英

如何從氣流中的 Python Operator 返回列表並將其用作 dags 中后續任務的參數

[英]How can I return lists from Python Operator in airflow and use it as argument for subsequent task in dags

我有 3 個任務要在相同的 dag 中運行。 而 Task1 返回字典 task2 和 task3 的列表嘗試使用 task1 返回的結果中的一個字典元素。

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,
     )

您應該使用 XCom 在不同任務之間傳遞變量/消息。 看看這個例子: 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 get_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,
     )

您可以使用XCom,因為它們專為任務間通信而設計。 如果您的字典很大,那么我建議將其存儲為 csv 文件。 通常,Airflow 中的任務不會在它們之間共享數據,因此 XComs 是實現它們的一種方式,但僅限於少量數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM