我正在尝试为source_objects
的{{1}}字段提供一个字符串列表,但是以下代码却出现错误:
字符串索引必须是整数,而不是Unicode
我不知道的事情:
GoogleCloudStorageToBigQueryOperator
的{{1}}值?return
函数而无需提供上下文?在我看来,任务实例不需要提供上下文。我想到的事情:
我想做的事情:
此外,似乎某些运算符的字段使用了称为get_file_name
的功能,模板字段背后的机制是什么?不只是xcom_pull
和templated_field
的意思吗?
最后一个,为什么PythonOperator
不返回BashOperator
?
PythonOperator
我是Python和Airflow的新手。我猜这些事情应该是微不足道的。我敢肯定,我在这里有些误会。
答案 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)