Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
Airflow 气流:如何模板化或将Python可调用函数的输出作为参数传递给其他任务?_Airflow_Apache Airflow Xcom - Fatal编程技术网

Airflow 气流:如何模板化或将Python可调用函数的输出作为参数传递给其他任务?

Airflow 气流:如何模板化或将Python可调用函数的输出作为参数传递给其他任务?,airflow,apache-airflow-xcom,Airflow,Apache Airflow Xcom,我不熟悉气流,正在努力使我的ETL管道更加可重用。最初,我有几行顶级代码,可以根据几个用户输入参数确定作业的开始,但通过多次搜索,我发现这会触发,在截断表时会导致一些不必要的行为 现在,我正在研究将这个顶级代码包装到一个Python可调用代码中,这样在刷新时它是安全的,但是我不确定将输出传递给其他任务的最佳方式。我的代码要点如下: def get_job_dts(): #Do something to determine the appropriate job_start_dt a

我不熟悉气流,正在努力使我的ETL管道更加可重用。最初,我有几行顶级代码,可以根据几个用户输入参数确定作业的开始,但通过多次搜索,我发现这会触发,在截断表时会导致一些不必要的行为

现在,我正在研究将这个顶级代码包装到一个Python可调用代码中,这样在刷新时它是安全的,但是我不确定将输出传递给其他任务的最佳方式。我的代码要点如下:

def get_job_dts(): 

     #Do something to determine the appropriate job_start_dt and job_end_dt

     #Package up as a list as inputs to other PythonCallables using op_args

     job_params = [job_start_dt, job_end_dt]

     return job_params

t0 = PythonOperator(
    task_id = 'get_dates'
    python_callable = get_job_dts
    dag=dag
)

t1 = PythonOperator(
     task_id = 'task_1'
     ,python_callable=first_task
     ,op_args=job_params #<-- How do I send job_params to op_args??
     ,dag=dag
)

t0 >> t1
def get_job_dts():
#做点什么来确定合适的作业开始和结束
#使用op_args打包为列表,作为其他pythonCallable的输入
作业参数=[作业开始,作业结束]
返回作业参数
t0=蟒蛇算子(
任务\u id='获取\u日期'
python\u callable=get\u job\u dts
dag=dag
)
t1=蟒蛇算子(
task_id='task_1'
,python_callable=第一个任务
,op_args=job_params#>t1

我到处搜索,听到有人提到jinja模板、变量或XCom,但我对如何实现它还不清楚。有没有人能举个例子,让我看看如何将该列表保存到一个变量中,以供我的其他任务使用?

最好的方法是在get\u job\u dts中将您的值推送到XCom中,然后从m Xcom在第一个任务中

def get_job_dts(**kwargs): 

     #Do something to determine the appropriate job_start_dt and job_end_dt

     #Package up as a list as inputs to other PythonCallables using op_args

    job_params = [job_start_dt, job_end_dt]

    # Push job_params into XCom
    kwargs['ti'].xcom_push(key='job_params', value=job_params)
    return job_params


def first_task(ti, **kwargs):
    # Pull job_params into XCom
    job_params = ti.xcom_pull(key='job_params')
    # And then do the rest


t0 = PythonOperator(
    task_id = 'get_dates'
    python_callable = get_job_dts
    dag=dag
)

t1 = PythonOperator(
    task_id = 'task_1',
    provide_context=True,
    python_callable=first_task,
    op_args=job_params,
    dag=dag
)

t0 >> t1
如前所述,XCOM是一个不错的选择。我的实现是面向教程的,在教程中,我隐式地从PythonCallable中的返回值自动执行推送

我仍然对传入(ti,**kwargs)和使用(**上下文)到正在拉取的函数的区别感到困惑。另外,“ti”从何而来

请澄清

def get_job_dts(**kwargs): 

     #Do something to determine the appropriate job_start_dt and job_end_dt

     #Package up as a list as inputs to other PythonCallables using op_args

     job_params = [job_start_dt, job_end_dt]

     # Automatically pushes to XCOM, refer to: Airflow XCOM tutorial: https://airflow.apache.org/concepts.html?highlight=xcom#xcoms
     return job_params

def first_task(**context):

    # Change task_ids to whatever task pushed the XCOM vars you need, rest are standard notation
    job_params = job_params = context['task_instance'].xcom_pull(task_ids='get_dates')

    # And then do the rest


t0 = PythonOperator(
    task_id = 'get_dates'
    python_callable = get_job_dts
    dag=dag
)

t1 = PythonOperator(
    task_id = 'task_1',
    provide_context=True,
    python_callable=first_task,
    dag=dag
)

t0 >> t1

正如您提到的动态更改任务开始时间和结束时间,我认为您需要的是创建动态dag,而不仅仅是将参数传递给dag。特别是,在不更改dag名称的情况下更改开始时间和间隔将导致意外的结果,强烈建议不要这样做。因此,您可以参考这一点来查看此策略是否正确可以帮忙。

谢谢您的回复!您能解释一下“ti”在哪里吗来自?我也看到人们使用**上下文作为参数,**kwargs==**context?最后,所有实现XCOM的DAG(无论是拉还是推)都需要providecontext=True吗?还是只有DAG才需要拉?这段代码在语法上不正确且不可复制,你能提供一个完整的示例吗?我认为你不能通过我的任务nstance明确表示,但您应该使用
**kwargs
**context
(这是相同的,context只是kwargs的另一个名称)与
provide_context=True
保持一致。有关上下文的结构,请参见。Airflow在其github上有一些很好的示例。我相信您的回答是正确的。