Airflow 如何在非运算符python函数中访问Xcom值
我有一个存储的XCom值,我想将其传递给另一个python函数,该函数不使用python操作符调用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 ------
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定义文件中执行此操作,但它可能会不必要地加载后端数据库,读取