Airflow 将OracleOperator的输出发送到中的另一个任务

Airflow 将OracleOperator的输出发送到中的另一个任务,airflow,apache-airflow-xcom,Airflow,Apache Airflow Xcom,我需要在另一个任务中使用oracleOperator的输出以进一步执行。我遇到的问题是,当我将数据拉入另一个任务并打印它时,结果是无。没有抛出错误,但数据未通过。此外,任务UI中的xcom选项卡显示键和值为空 我的代码如下: 从气流导入DAG 从afflow.operators.oracle_operator导入OracleOperator 从afflow.operators.python_operator导入PythonOperator 从airflow.utils.dates导入天\u ar

我需要在另一个任务中使用oracleOperator的输出以进一步执行。我遇到的问题是,当我将数据拉入另一个任务并打印它时,结果是无。没有抛出错误,但数据未通过。此外,任务UI中的xcom选项卡显示键和值为空

我的代码如下:

从气流导入DAG 从afflow.operators.oracle_operator导入OracleOperator 从afflow.operators.python_operator导入PythonOperator 从airflow.utils.dates导入天\u args={ “所有者”:“xyz”, “开始日期”:2天前, } dag=dag'example\u xcom',schedule\u interval=@once,default\u args=args,tags=['example'] def拉具**kwargs: ti=kwargs['ti'] 获取值1 pull\u value\u 1=ti.xcom\u pullkey=None,任务\u id='push' 拉拔器中的打印值 打印输出值1 拉力=蟒蛇器 任务_id='pullee', dag=dag, python_callable=puller, 提供上下文=True, push=OracleOperator 任务_id='data', sql='SELECT*FROM CUSTOMERS', oracle_conn_id='1', 提供上下文=True, dag=dag, 推>>拉
你的狗在这里看起来很好。但是,通过查看的源代码,您可能会发现主执行方法实际上使用的是OracleHook模块扩展:

def execute(self, context):
  self.log.info('Executing: %s', self.sql)
  hook = OracleHook(oracle_conn_id=self.oracle_conn_id)
  hook.run(
      self.sql,
      autocommit=self.autocommit,
      parameters=self.parameters)
这里的罪魁祸首是hook.run方法,它运行SQL查询,但不向Xcom返回任何内容,因此Xcom_pull方法不会检索任何记录

runself,sql,autocommit=False,parameters=None[source]

运行命令或命令列表。将sql语句列表传递给 sql参数以使它们按顺序执行

作为一种解决方案,您可以创建自定义的OracleOperator,复制正版OracleOperator的源代码并用方法替换hook.run,然后您将期望执行嵌套查询,获取结果记录以进一步推送到下一个任务


希望你觉得这个有用

您可以使用以下代码。基本上使用PythonOperator和OracleHook

从气流导入DAG 从afflow.operators.python_operator导入PythonOperator 从afflow.hooks.oracle\u hook导入OracleHook 从airflow.utils.dates导入天\u args={ “所有者”:“xyz”, “开始日期”:2天前, } dag=dag'example\u xcom',schedule\u interval=@once,default\u args=args,tags=['example'] def拉具**kwargs: ti=kwargs['ti'] 获取值1 pulls\u value\u 1=ti.xcom\u pulltask\u id='data' 拉拔器中的打印值:,拉拔值1 def从oracle获取数据**kwargs: oracle\u hook=OracleHookoracle\u conn\u id=kwargs['oracle\u conn\u id'] 返回oracle\u hook.get\u recordssql=kwargs['sql'] push=蟒蛇算子 任务_id='data', op_kwargs={'oracle_conn_id':'oracle_conn_id','sql':'SELECT*FROM CUSTOMERS'} 提供上下文=True, python\u callable=从oracle获取数据, dag=dag, 拉力=蟒蛇器 任务_id='pullee', dag=dag, python_callable=puller, 提供上下文=True, 推>>拉
你好该值在push调用中被推送到xcom中,我可以在日志中看到它,但是我仍然无法在puller函数中拉取数据。它将值打印为“无”;i、 e.“Pull_value_1”打印为“None”@MrSir更新了代码,请立即尝试。基本上,从xcom\U pullStill中删除key=None仍然无法在puller函数中获得它,它仍然将其打印为None。此外,puller任务的XCOM参数没有值;但是推手的任务是。对不起,我的错。我已经在xcom_pull中更新了更新任务ID所需的答案,这次也在我的机器上进行了测试。