Airflow 如何在非运算符python函数中访问Xcom值

Airflow 如何在非运算符python函数中访问Xcom值,airflow,Airflow,我有一个存储的XCom值,我想将其传递给另一个python函数,该函数不使用python操作符调用 def sql_file_template(): <some code which uses xcom variable> def call_stored_proc(**kwargs): #project = kwargs['row_id'] print("INSIDE CALL STORE PROC ------

我有一个存储的XCom值,我想将其传递给另一个python函数,该函数不使用python操作符调用


def sql_file_template():
    <some code which uses xcom variable>

def call_stored_proc(**kwargs):
        
        #project = kwargs['row_id']
        print("INSIDE CALL STORE PROC ------------")   
        query = """CALL `{0}.dataset_name.store_proc`(
                          '{1}' # source table
                        , ['{2}'] # row_ids
                        , '{3}' # pivot_col_name   
                        , '{4}' # pivot_col_value
                        ,  100 # max_columns
                        , 'MAX' # aggregation
                );"""
        query = query.format(kwargs['project'],kwargs['source_tbl'] ,kwargs['row_id'],kwargs['pivot_col'],kwargs['pivot_val'])
        job = client.query(query, location="US")
        for result in job.result():
            task_instance = kwargs['task_instance']
            task_instance.xcom_push(key='query_string', value=result) 
                print result
                return result



bq_cmd = PythonOperator (
    task_id=                    'task1'
    provide_context=            True,
    python_callable=            call_stored_proc,
    op_kwargs=                  {'project'        : project,
                                 'source_tbl'     : source_tbl,
                                 'row_id'         : row_id,
                                 'pivot_col'      : pivot_col,
                                 'pivot_val'      : pivot_val
                                },
    dag=                        dag
)

dummy_operator >> bq_cmd
sql_file_template()
存储过程的输出是一个字符串,它是使用xcom捕获的

现在我想在不使用PythonOperator的情况下将这个值传递给一些python函数sql\u file\u模板


def sql_file_template():
    <some code which uses xcom variable>

def call_stored_proc(**kwargs):
        
        #project = kwargs['row_id']
        print("INSIDE CALL STORE PROC ------------")   
        query = """CALL `{0}.dataset_name.store_proc`(
                          '{1}' # source table
                        , ['{2}'] # row_ids
                        , '{3}' # pivot_col_name   
                        , '{4}' # pivot_col_value
                        ,  100 # max_columns
                        , 'MAX' # aggregation
                );"""
        query = query.format(kwargs['project'],kwargs['source_tbl'] ,kwargs['row_id'],kwargs['pivot_col'],kwargs['pivot_val'])
        job = client.query(query, location="US")
        for result in job.result():
            task_instance = kwargs['task_instance']
            task_instance.xcom_push(key='query_string', value=result) 
                print result
                return result



bq_cmd = PythonOperator (
    task_id=                    'task1'
    provide_context=            True,
    python_callable=            call_stored_proc,
    op_kwargs=                  {'project'        : project,
                                 'source_tbl'     : source_tbl,
                                 'row_id'         : row_id,
                                 'pivot_col'      : pivot_col,
                                 'pivot_val'      : pivot_val
                                },
    dag=                        dag
)

dummy_operator >> bq_cmd
sql_file_template()
根据气流文档,只能在任务之间访问xcom

有人能帮上忙吗?

那么您想在不创建任何气流DAG/任务的情况下,通过不同的项目/模块访问XCOM外部气流

Airflow用于将它包含的所有内容映射到相应的SQLAlchemy后端meta db表

因此,这可以通过两种方式实现

利用Airflow的SQLAlchemy模型

无需创建任务或DAG。这里有一个未经测试的代码片段供参考

请注意,由于它正在导入airflow包,因此仍然需要在python类路径上安装airflow,并连接到后端数据库,但这里我们不创建任何任务或DAG。此代码段可以在独立的python文件中运行

对于这个片段,我提到了我最喜欢在哪个地方窥探Airflow的SQLAlchemy魔法

直接查询Airflow的SQLAlchemy后端元数据库

连接到meta db并运行此查询

从xcom中选择值,其中dag_id=和task_id=和


如果您有权访问Airflow安装,您希望查询配置、数据库访问和代码,则可以使用Airflow的Airflow.models.XCom:get_one class方法:

从日期时间导入日期时间 从airflow.models导入XCom 执行日期=日期时间2020年8月28日 xcom\u value=xcom.get\u oneexecution\u date=execution\u date, 任务\u id=任务\u id, dag_id=_dag_id
我想用相同的代码访问xcom,而不是在外部。上面的代码是dag代码,我想用同样的方式访问xcom变量code@Neha0908无论您是在气流代码中使用,还是独立于气流代码使用,这两种建议的解决方案都将有效。当在task中使用XCOM时,您可以从TaskInstance类调用XCOM_pull方法,这只是一个快捷方式,它使用与上面相同的方法。请参阅,虽然您也可以在dag定义文件中执行此操作,但它可能会不必要地加载后端数据库,读取