在Airflow中将返回值从操作员传递给后续操作员

时间:2018-08-17 09:19:14

标签: python airflow google-cloud-composer

我正在尝试为source_objects的{​​{1}}字段提供一个字符串列表,但是以下代码却出现错误:

  

字符串索引必须是整数,而不是Unicode

我不知道的事情:

  • 如何在DAG范围内使用XCOM获得GoogleCloudStorageToBigQueryOperator的{​​{1}}值?
  • 如何在DAG范围内调用return函数而无需提供上下文?在我看来,任务实例不需要提供上下文。

我想到的事情:

  • 重写运算符并以XCOM作为参数

我想做的事情:

  • 我希望能够致电接线员

此外,似乎某些运算符的字段使用了称为get_file_name的功能,模板字段背后的机制是什么?不只是xcom_pulltemplated_field的意思吗?

最后一个,为什么PythonOperator不返回BashOperator

PythonOperator

我是Python和Airflow的新手。我猜这些事情应该是微不足道的。我敢肯定,我在这里有些误会。

1 个答案:

答案 0 :(得分:1)

经过多次测试,我想出了这个解决方案,这要感谢tobi6的评论,它为我指明了正确的方向。我必须使用 template_fields 功能。

当我尝试返回带有单个字符串的列表时,发生了串联错误,因此我不得不在XCOM中返回单个字符串,并用方括号将对XCOM的模板调用括起来以使结果成为列表。

这是最终代码:

with DAG('bq_load_file_from_cloud_function', default_args=default_args) as dag:

    def get_file_name_from_conf(ds, **kwargs):
        return kwargs['dag_run'].conf['fileName']

    get_file_name = PythonOperator(
        task_id='get_file_name',
        provide_context=True,
        python_callable=get_file_name_from_conf)

    bq_load = GoogleCloudStorageToBigQueryOperator(
        task_id='bq_load', 
        bucket='src_bucket', 
        source_objects=["{{ task_instance.xcom_pull(task_ids='get_file_name') }}"],
        destination_project_dataset_table='project:dataset.table', 
        write_disposition='WRITE_APPEND')

    bq_load.set_upstream(get_file_name)