airflow xcom.pull()访问上游任务的隐式返回值

时间:2018-07-20 09:57:35

标签: python airflow

我是Python的新手,也是Airflow的新手。

我正在使用Snowflake数据库。

我创建了一个运算符SnowflakeGetDataOperator,该运算符返回雪花hook.get_records方法(我返回的是少量的种类-通常是单个单元格)

所以现在我在任务中有这个任务:

check_last_run_date=SnowflakeGetDataOperator(
    task_id='check_last_run_date',
    sql="SELECT COALESCE (max(update_date), '2000-01-01') FROM poc.dwh.fact_collector",
    snowflake_conn_id='snowflake_default',
    dag=dag)

此任务运行时,我在Airfow后端看到此任务的xcom对象(运算符的返回值-我未使用xcom.push()

我的问题是如何从下一个下游任务访问此值?

我需要将其用作下一个sql运算符的参数。

我已经在dag代码中尝试了以下行

{{ task_instance.xcom_pull(task_ids='check_last_run_date') }}

但是代码无法识别task_instance属性。

编辑

下一个任务应该类似于

fill_agg_table = SnowflakeOperator( 
task_id='fill_cust_agg_data', 
sql= str.replace ("""INSERT INTO oc.TEMP_COMPUTING.collector_customer_aggregative_data 
  ( SELECT * FROM POC.STG."stg_atg_data" WHERE XXXXX < current_date)""", 
    'XXXXX', 
    {{ task_instance.xcom_pull(task_ids='check_last_run_date') }}, 
snowflake_conn_id='snowflake_default', 
dag=dag )) 

2 个答案:

答案 0 :(得分:0)

您的第二项任务看起来有点不寻常。如果将字段模板化,则只需将字段放入字符串中即可。

实际上,使用string.replacestring.format会弄乱您的宏,并且在Airflow中效果不佳。其他宏在这里:https://airflow.apache.org/code.html#macros

确保在自己的运算符中为sql字段模板化。如何执行此操作,请参见示例代码https://github.com/apache/incubator-airflow/blob/master/airflow/contrib/operators/bigquery_operator.py并检查变量templated_fields

建议:

sql= """INSERT INTO oc.TEMP_COMPUTING.collector_customer_aggregative_data 
  ( SELECT * FROM POC.STG."stg_atg_data" WHERE {{ task_instance.xcom_pull(task_ids='check_last_run_date') }} < current_date)""", 

答案 1 :(得分:0)

后来,但标题就是答案:

xcom_pull()(不带参数)将为dagrun返回最新的return_value,因此,假设仅执行一个任务,则直接上游任务推入的值。

文档中没有明确说明,但我比硬编码任务名称更好。