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)
这可能会向正确的方向暗示: