我制作了一个自定义气流操作符,此操作符接受输入,此操作符的输出位于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
最好的方法是什么?
答案 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)
...
如果您只想对它们进行硬编码,则可能不需要参数。这取决于您的使用案例。