【问题标题】:why can't I delete all files from an azure blobstorage container in databricks为什么我不能从 databricks 中的 azure blob 存储容器中删除所有文件
【发布时间】:2019-03-19 10:44:01
【问题描述】:

我想使用以下命令从 blobstorage 容器中删除所有文件:

dbutils.fs.rm

像这样指向一个特定文件可以正常工作:

dbutils.fs.rm("/mnt/inbox/InvLog.txt", True)

但我想删除容器的所有内容。我尝试了以下但没有成功:

dbutils.fs.rm("/mnt/inbox/*.txt", True)
dbutils.fs.rm("/mnt/inbox/", True)
dbutils.fs.rm("/mnt/inbox", True)
dbutils.fs.rm("/mnt/inbox/*.*", True)

有什么建议吗?

更新:尝试了 ZF007 建议 %fs rm -r mnt/inbox 但它抛出错误:

java.lang.NullPointerException

【问题讨论】:

  • 也试试非优雅的更新:-)

标签: python databricks azure-databricks


【解决方案1】:

正如您在here 给出的示例中所见,您可以在单个文件方法中使用dbutils.fs.rm("/mnt/inbox/InvLog.txt", True)

网页上的示例为您提供以下单个文件:

dbutils.fs.rm("/foobar/baz.txt")

删除文件夹 foobar 下的文件是这样完成的:

 %fs rm -r foobar

在你的情况下使用:

%fs rm -r mnt/inbox

请记住 linux、Windows 和 OSX 系统之间的文件夹注释差异。

更新:

您可以尝试以下非优雅的捷径解决方案来规避您声明的 java 异常:

import os
import ...snippet... # yours to fill in here what else you need to import.

files_processed = 0
files_path = [os.path.abspath(x) for x in os.listdir()]

print (files_path) # your filepath might need cleaning for it can be accepted. It prints here all found files.

for item in files_path:
    if os.path.isfile(item) == True:
        dbutils.fs.rm(item, True)
        files_processed +=1
    else:
        print ('skipped folder: %s', item)

print ("job done", ' : ', file_processed)

【讨论】:

  • 它似乎不起作用。它抛出错误:java.lang.NullPointerException
  • ...很好,您尝试过的阅读。我不是 azure-databricks 方面的专家,但建议您在当前提供的问题文本下使用您的发现来更新您的问题。例如,使用项目符号名称“更新 1:”并在带有“>”符号的黄色框中说明您的错误。
  • 您的第二个建议返回“工作完成”,但不幸的是文件没有被删除。
  • 您可能需要检查您的文件路径是否正确以便被接受。请参阅脚本中的代码/注释以进行检查。
  • 可能是databricks接受"/mnt/inbox/InvLog.txt"但不接受F:/mnt/inbox/InvLog.txt...然后由于系统特定的文件路径格式,需要重新格式化文件路径。 (从windows mache atm回答你的问题。)。所以在我的情况下,它将是 'f:\\mnt\inbox\InvLog.txt`。为了查看这是否是手头的问题,我添加了一个“files_proccessed”复选标记以查看问题是否存在。
【解决方案2】:

我发现命令

%fs rm -r /mnt/inbox/test

仅适用于文件夹。不是直接在容器中的文件上,所以在上面的代码中, inbox 是容器,test 是文件夹。然后它工作。文件需要在一个文件夹中。

【讨论】:

    【解决方案3】:

    以下对我有用。它列出了 dbfs 文件夹中的所有文件并将其删除。

    for filepath in dbutils.fs.ls('/mnt/FOLDERNAME'):
      file = str(filepath).split('\'')[1]
      dbutils.fs.rm(file, True)
    

    如果您想将删除限制为任何扩展名(以下示例中的 csv)。

    for filepath in dbutils.fs.ls('/mnt/FOLDERNAME'):
      file = str(filepath).split('\'')[1]
          if '.csv' in file:
              dbutils.fs.rm(file, True)
    

    【讨论】:

      【解决方案4】:

      我发现了同样的问题。

      %fs rm -r path 或者 dbutils.fs.rm('path', True)

      检查path 是否指向“容器”而不是“文件夹”。 我们无法从数据块中删除 azure blob 容器。

      【讨论】:

        猜你喜欢
        • 2020-04-09
        • 2019-07-28
        • 2016-04-03
        • 1970-01-01
        • 2019-03-08
        • 1970-01-01
        • 2018-11-05
        • 2014-07-20
        • 2016-09-01
        相关资源
        最近更新 更多