【问题标题】:How to pass a variable task_ids to a xcom.pull in Airflow?如何将变量 task_ids 传递给 Airflow 中的 xcom.pull?
【发布时间】:2020-12-22 21:32:51
【问题描述】:

有时我发现使用循环创建任务很方便。

下面是一个 SqoopOperator 示例,我在 where 子句中使用了前一个 PythonOperator 中的 xcom 值。我正在尝试使用变量 get_delivery_sqn_task_id 来访问正确的 xcom 值 ti.xcom_pull(task_ids=get_delivery_sqn_task_id ,但这不起作用(返回 ())。

我可以将所有内容都排除在循环之外,但是我认为这会使代码非常难看。是否有一个优雅的解决方案可以使用变量 task_ids 来检索 xcom 值?我想最好的解决方案是使用气流变量。

for table in tables:
    
    get_delivery_sqn_task_id ='get_delivery_sqn_'+ table 
    
    get_delivery_sqn_task = PythonOperator(
        task_id = get_delivery_sqn_task_id,
        python_callable = get_delivery_sqn,
        op_kwargs = {
            'table_name': table
            },
        provide_context = True,
        dag = dag
    )
    
    sqoop_operator_task = SqoopOperator(
        task_id = "sqoop_"+table,
        conn_id = "DWDH_PROD",
        table = table,
        cmd_type = "import",
        target_dir = "/sourcedata/sqoop_tmp/"+table,
        num_mappers = 1,
        where = "delivery_sqn > {{ ti.xcom_pull(task_ids=get_delivery_sqn_task_id, key='return_value') }}",
        dag = dag
    )
   

【问题讨论】:

    标签: python jinja2 airflow


    【解决方案1】:

    你可以这样做:

    "delivery_sqn > {{{{ ti.xcom_pull(task_ids={}, key='return_value') }}}}".format(get_delivery_sqn_task_id)
    

    【讨论】:

    • 感谢埃拉德!仅缺少单引号以使 task_ids 成为字符串,但这有效! f"delivery_sqn > {{{{ ti.xcom_pull(task_ids='{get_delivery_sqn_task_id}', key='return_value') }}}}"
    猜你喜欢
    • 1970-01-01
    • 2023-01-04
    • 2021-12-01
    • 2022-08-18
    • 1970-01-01
    • 2021-05-25
    • 2018-12-28
    • 2011-04-12
    • 2017-01-24
    相关资源
    最近更新 更多