azure - 无法通过 Databricks 笔记本从 Azure 存储容器中删除目录
问题描述
我正在尝试从安装到我的 DBFS 的 Azure 存储容器中删除空目录
我能够列出所有没有文件的目录。
%sh
find /dbfs/mnt/test/logs/2021 -empty -type d
结果 :
/dbfs/mnt/test/logs/2021/02/12
/dbfs/mnt/test/logs/2021/02/15
/dbfs/mnt/test/logs/2021/02/16
但是当我尝试删除它们时,由于资源暂时不可用而失败。
%sh
find /dbfs/mnt/test/logs/ -type d -exec rmdir {} \;
结果:
rmdir: failed to remove '/dbfs/mnt/test/logs/': Directory not empty
rmdir: failed to remove '/dbfs/mnt/test/logs/2021': Directory not empty
rmdir: failed to remove '/dbfs/mnt/test/logs/2021/02': Directory not empty
rmdir: failed to remove '/dbfs/mnt/test/logs/2021/02/12': Resource temporarily unavailable
我能够成功删除某些天以前的文件。删除目录不起作用。(以下命令删除正在工作的文件
%sh
find /dbfs/mnt/test/logs/ -name "*.log" -type f -mtime +5 -exec rm -f {} \;
解决方案
首先要记住 - DBFS 是对云 blob 存储的抽象,其中没有真正的目录 - 它们只是用于组织数据的前缀。如果你这样做%sh ls -ls /dbfs/mnt/test/logs/
了,你可能会注意到所有目录都具有相同的时间戳,并且可能是最近的一个——我不记得它是如何计算的了。只有文件有时间戳。
因此,如果您需要可靠地删除目录,最好使用 dbutils.fs.rm('/mnt/test/logs/', True)
(在 Python 中,或在 Scala 中类似)递归地删除目录(请参阅docs)。但是有一些限制,比如不支持通配符等,所以需要生成要删除的目录列表,然后进行删除。
推荐阅读
- php - Nginx 到 php-fpm Docker 容器未连接
- node.js - 无法在 Google OAuth2.0 中对服务器到服务器应用程序进行身份验证
- postgresql - 我正在尝试从 localhost 服务器连接到 pgadmin
- jquery - 如何动态添加 id 并为每个复选框添加标签
- neo4j - Neo4J:返回给定键的每个值的最新数据节点
- php - 如何防止 laravel json 响应添加反斜杠
- r - scale() 的取值范围是多少?
- firebase - Firebase Hosting: is it possible to rewrite a URL and pass part of the path to Cloud Run?
- javascript - React Router 和 redux auth token 双重渲染
- c# - 我需要什么样的 Webhook 接收器来处理 ASP.NET c# 中编码的 JWT