如何使用Airflow的S3DeleteObjectsOperator仅删除S3文件而非子文件夹?
在Airflow中用S3DeleteObjectsOperator仅删除文件而非“子文件夹”
首先得明确:S3本身没有真正的文件夹,所谓的“子文件夹”只是对象键里带/的前缀(比如test/sub/),这类前缀本身不是实际的对象——除非你手动创建过空文件夹标记(一个键以/结尾、大小为0的对象)。
针对你的问题,答案是可以实现,具体看S3DeleteObjectsOperator的行为:
- 这个Operator默认只会删除实际存在的文件对象(有内容的键)。如果你的S3桶里没有手动创建过空文件夹标记,用
prefix参数指定路径前缀后,只会删掉该前缀下的所有文件,不会影响所谓的“子文件夹”(因为它们根本不是实际存在的对象)。
看你给出的代码:
delete_operator = S3DeleteObjectsOperator( task_id=f't0_s3_cleanup_task_{{keys}}', aws_conn_id='aws_s3', bucket=var_s3_bucket, prefix=var_qa_prefix ) delete_operator.execute(context)
这段代码里的prefix=var_qa_prefix会匹配所有以该前缀开头的对象键。比如var_qa_prefix设为qa/logs/,那么qa/logs/20240101.log、qa/logs/errors/error.log这类文件会被删除,但qa/logs/errors/这个“子文件夹”不会被删(只要它不是手动创建的空对象)。
注意事项
- 如果之前手动创建过空文件夹标记(比如通过S3控制台新建的空文件夹),这些标记是大小为0的对象,键以
/结尾,此时Operator会把它们也删掉。要是想保留这些标记,就得过滤掉键以/结尾的对象。 - 要是需要更精准的控制,可以先通过
S3ListOperator列出前缀下的所有对象,排除掉以/结尾的键,再把筛选后的文件键传给S3DeleteObjectsOperator的keys参数,代替prefix使用。
内容的提问来源于stack exchange,提问作者RumanaC
相关产品推荐
相关产品推荐

