Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用一个Python任务的输出,并将其用作上另一个Python任务的输入_Python_Mongodb_Airflow_Pipeline - Fatal编程技术网

使用一个Python任务的输出,并将其用作上另一个Python任务的输入

使用一个Python任务的输出,并将其用作上另一个Python任务的输入,python,mongodb,airflow,pipeline,Python,Mongodb,Airflow,Pipeline,因此,我使用ApacheAirflow创建了一个数据流,用于获取存储在Pandas数据帧中的一些数据,然后将其存储到MongoDB中。所以我有两个python方法,一个用于获取数据并返回数据帧,另一个用于将其存储到相关数据库中。如何将一个任务的输出作为另一个任务的输入?这是我迄今为止总结和浓缩的版本 我研究了xcom pull和push的概念,这就是我在下面实现的,我还看到了MongoHook的气流,但不太确定如何使用它 import pandas as pd import pymongo im

因此,我使用ApacheAirflow创建了一个数据流,用于获取存储在Pandas数据帧中的一些数据,然后将其存储到MongoDB中。所以我有两个python方法,一个用于获取数据并返回数据帧,另一个用于将其存储到相关数据库中。如何将一个任务的输出作为另一个任务的输入?这是我迄今为止总结和浓缩的版本

我研究了xcom pull和push的概念,这就是我在下面实现的,我还看到了MongoHook的气流,但不太确定如何使用它

import pandas as pd
import pymongo
import airflow
from datetime import datetime, timedelta
from airflow.models import DAG
from airflow.operators.python_operator import PythonOperator


def get_data(name, **context):
    data = pd.read_csv('dataset.csv')
    df = data.loc[data.name == name]
    context['ti'].xcom_push(task_ids=['get-data'], value=data)

def push_to_db(df, dbname, collection):
    client = pymongo.MongoClient(-insert creds here-)
    db = client[dbname][collection]
    data = df.to_dict(orient='records')
    db.insert_many(data)

args = {
    'owner': 'Airflow',
    'start_date': airflow.utils.dates.days_ago(2),
}

dag = DAG(
  dag_id='simple_xcom',
  default_args=args,
  start_date=datetime(2019, 09, 02),
  schedule_interval="@daily",
  retries=2
)

task1 = PythonOperator(task_id='get-data', params=['name': 'John'], 
        python_callable=get_data, 
        provide_context=True, dag=dag)

task2 = PythonOperator(task_id='load-db', params=['df': context['ti'].xcom_pull(task_ids=['get-data'], key='data'), 
    'dbname': 'person', 'table': 'salary'), 
    python_callable=push_to_db, provide_context=True, dag=dag) 

task1 >> task2 



每次我尝试运行它时,它都会显示上下文不存在。因此,在将一个任务的输出作为另一个任务的输入方面,我可能做了一些错误的事情?

看看示例xcom DAG

https://github.com/apache/airflow/blob/master/airflow/example_dags/example_xcom.py
请理解上下文是一个Python字典,包含关于当前运行的DAG/task实例的信息。由于它包含有关正在运行的实例的信息,所以它仅在任务和的运行时可用。特别是,pre_execute..,execute。。然后再执行。。提供上下文