我正尝试创建如下所示的气流障碍:
我有一个很大的python代码,最终创建了一个文件。
该文件是使用特定名称创建的,例如{
"output": {
"text": {
"values": [
"say something <a href='http://www.website.com/'>link text</a>"
],
"selection_policy": "sequential"
}
}
}
以下气流任务是sales20180802130200.json
运算符。它需要获取文件名才能上传到s3。
第一个python文件可能由s3BucketUpload
运行。如何使用文件名创建Xcom密钥?还有其他方法可以传递值吗?
谢谢 沙比
答案 0 :(得分:0)
只要在操作员类的模板参数中包含路径参数,Airflow就会为您插值。我不知道s3BucketUpload运算符的样子,所以我假设参数名称。
class s3BucketUploadOperator(BaseOperator):
# this tuple is not used by anything in my operator classes and is not passed anywhere
template_fields = ('local_path', 's3_path', )
...
def py_fn(task_instance, **context):
task_instance.xcom_push(key='file_name', value='file.name')
py_task = PythonOperator(
dag=dag,
task_id='py_task',
provide_context=True,
python_callable=py_fn
)
s3_task = s3BucketUploadOperator(
dag=dag,
task_id='s3_task',
s3_conn_id='?',
local_path="path/to/dir/{{ task_instance.xcom_pull(key='file_name', task_ids='py_task') }}",
s3_path="path/to/s3/dir/{{ task_instance.xcom_pull(key='file_name', task_ids='py_task') }}"
)
编辑
如果要使用BashOperator,bash_command="echo {{ task_instance.xcom_pull(key='file_name', task_ids='py_task') }}"
应该将文件名打印到任务日志。