Python 在气流中将返回值从操作员传递给后续操作员

Python 在气流中将返回值从操作员传递给后续操作员,python,airflow,google-cloud-composer,Python,Airflow,Google Cloud Composer,我试图为GoogleCloudStorageToBigQueryOperator的source\u objects字段提供一个字符串列表,但由于以下代码,我得到了一个错误: 字符串索引必须是整数,而不是unicode 我不知道的事情: 如何在DAG范围内使用XCOM获取get_file_name的return值 如何在DAG范围内调用xcom\u pull函数而不必提供上下文?在我看来,任务实例不需要提供上下文 我想到的事情: 重写运算符并将XCOM作为参数 我想做的事情: 我想打电话

我试图为
GoogleCloudStorageToBigQueryOperator
source\u objects
字段提供一个字符串列表,但由于以下代码,我得到了一个错误:

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

我不知道的事情:

  • 如何在DAG范围内使用XCOM获取
    get_file_name
    return
  • 如何在DAG范围内调用
    xcom\u pull
    函数而不必提供上下文?在我看来,任务实例不需要提供上下文
我想到的事情:

  • 重写运算符并将XCOM作为参数
我想做的事情:

  • 我想打电话给接线员
此外,一些操作员字段似乎使用了一种称为
模板化字段
的功能,模板字段背后的机制是什么?不仅仅是用于
PythonOperator
bash操作符

最后一个问题,为什么
PythonOperator
不返回
TaskInstance

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

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

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

    # t1, t2 and t3 are examples of tasks created by instantiating operators
    bq_load = GoogleCloudStorageToBigQueryOperator(
        task_id='bq_load', 
        bucket='src_bucket', 
        #source_objects=['data.csv'], 
        source_objects=get_file_name.xcom_pull(context='', task_ids='get_file_name'), 
        destination_project_dataset_table='project:dataset.table', 
        write_disposition='WRITE_EMPTY')

    bq_load.set_upstream(get_file_name)

我对Python和Airflow有点陌生。我想这类事情应该是微不足道的。我肯定这里有我误解的地方。

经过多次测试,我想出了这个解决方案,多亏tobi6的评论为我指明了正确的方向。我不得不使用模板\u字段功能

当我试图返回一个包含单个字符串的列表时,出现了连接错误,因此我必须在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)

这可能会向正确的方向暗示: