如何将数据从一个运算符传递到另一个运算符

时间:2017-12-11 17:17:26

标签: python airflow

我制作了一个自定义气流操作符,此操作符接受输入,此操作符的输出位于XCOM上。

我想要实现的是使用一些已定义的输入调用运算符,在Branch运算符内解析输出为Python可调用,然后将解析的输出传递给调用同一运算符树的另一个任务:

window.open('www.google.co.in', "test")

在任务CustomOperator_Task1 = CustomOperator( data={ 'type': 'custom', 'date': '2017-11-12' }, task_id='CustomOperator_Task1', dag=dag) data = {} def checkOutput(**kwargs): result = kwargs['ti'].xcom_pull(task_ids='CustomOperator_Task1') if result.success = True: data = result.data return "CustomOperator_Task2" return "Failure" BranchOperator_Task = BranchPythonOperator( task_id='BranchOperator_Task ', dag=dag, python_callable=checkOutput, provide_context=True, trigger_rule="all_done") CustomOperator_Task2 = CustomOperator( data= data, task_id='CustomOperator_Task2', dag=dag) CustomOperator_Task1 >> BranchOperator_Task >> CustomOperator_Task2 中,我想传递来自CustomOperator_Task2的已解析数据。现在它始终是空的BranchOperator_Task

最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

正如您的评论所示,自定义运算符的返回值为None,因此您的xcom_pull应该为空。 请明确使用xcom_push,因为气流的默认行为可能会随着时间而改变。

答案 1 :(得分:0)

我现在看到你的问题。由于Airflow的工作原理,设置data变量就像你一样无法工作。一个完全不同的过程将运行下一个任务,因此它不会具有data设置的上下文。

相反,BranchOperator_Task必须将解析后的输出推送到另一个XCom,以便CustomOperator_Task2可以显式获取它。

def checkOutput(**kwargs):
    ti = kwargs['ti']
    result = ti.xcom_pull(task_ids='CustomOperator_Task1')

    if result.success:
        ti.xcom_push(key='data', value=data)
        return "CustomOperator_Task2"
    return "Failure"

BranchOperator_Task = BranchPythonOperator(
    ...)

CustomOperator_Task2 = CustomOperator(
    data_xcom_task_id=BranchOperator_Task.task_id,
    data_xcom_key='data',
    task_id='CustomOperator_Task2',
    dag=dag)

然后您的操作员可能会看起来像这样。

class CustomOperator(BaseOperator):

    @apply_defaults 
    def __init__(self, data_xcom_task_id, data_xcom_key, *args, **kwargs):
        self.data_xcom_task_id = data_xcom_task_id
        self.data_xcom_key = data_xcom_key
    def execute(self, context):
        data = context['ti'].xcom_pull(task_ids=self.data_xcom_task_id, key=self.data_xcom_key)
        ...

如果您只想对它们进行硬编码,则可能不需要参数。这取决于您的使用案例。