Удалите файлы из каталога после загрузки в Databricks с помощью dbutils

Очень умный человек из StackOverflow помог мне скопировать файлы в каталог из Databricks здесь: копии файлов

Я использую тот же принцип для удаления файлов после их копирования, как показано в ссылке:

for i in range (0, len(files)):
  file = files[i].name
  if now in file:  
    dbutils.fs.rm(files[i].path,'/mnt/adls2/demo/target/' + file)
    print ('copied     ' + file)
  else:
    print ('not copied ' + file)

Однако я получаю сообщение об ошибке:

TypeError: '/ mnt / adls2 / demo / target /' имеет неправильный тип - ожидается класс bool.

Может кто-нибудь сообщить мне, как это исправить. Я думал, что будет просто удалить файл после его первоначального копирования с помощью команды dbutils.fs.rm


person Carltonp    schedule 08.01.2019    source источник
comment
хорошо, приведенный выше пример не отражает сценарий, который у нас есть в производстве, а именно: for i in range (0, len(files)): file = files[i].name if now in file: dbutils.fs.rm(files[i].path,'adl://xxxxxxxxxxxx.azuredatalakestore.net/Folder Structure/RAW/1stParty/LCMS/DE/stageone/') print ('removed ' + file) else: print ('not removed ' + file) Проблема заключалась в том, что я пропустил открытые скобки. Итак, проблема не в ожидается неправильный тип класса bool, как указано выше, проблема заключается в недопустимой синтаксической ошибке в print ('removed ' + file). Надеюсь, это поможет исправить.   -  person Carltonp    schedule 08.01.2019


Ответы (3)


Если у вас огромное количество файлов, их удаление может занять много времени. вы можете использовать искровой параллелизм для параллельного удаления файлов. Ответ, который я предоставляю, находится на scala, но его можно изменить на python.

вы можете проверить, существует ли каталог, используя эту функцию ниже:

import java.io._
def CheckPathExists(path:String): Boolean = 
{
  try
  {
    dbutils.fs.ls(path)
    return true
  }
  catch
  {
    case ioe:java.io.FileNotFoundException => return false
  }
}

Вы можете определить функцию, которая будет использоваться для удаления файлов. вы создаете эту функцию внутри объекта и расширяете этот объект из класса Serializable, как показано ниже:

object Helper extends Serializable
{
def delete(directory: String): Unit = {
    dbutils.fs.ls(directory).map(_.path).toDF.foreach { filePath =>
      println(s"deleting file: $filePath")
      dbutils.fs.rm(filePath(0).toString, true)
    }
  }
}

Теперь вы можете сначала проверить, существует ли путь, и если он возвращает истину, вы можете вызвать функцию удаления, чтобы удалить файлы в папке для нескольких задач.

val directoryPath = "<location"
val directoryExists = CheckPathExists(directoryPath)
if(directoryExists)
{
Helper.delete(directoryPath)
}
person Nikunj Kakadiya    schedule 12.02.2021

Если вы хотите удалить все файлы по следующему пути: '/mnt/adls2/demo/target/', есть простая команда:

dbutils.fs.rm('/mnt/adls2/demo/target/', True)

В любом случае, если вы хотите использовать свой код, взгляните на dbutils doc:

rm (dir: String, recurse: boolean = false): boolean - ›Удаляет файл или каталог.

Ожидается, что второй аргумент функции будет логическим, но в вашем коде есть строка с путем:

dbutils.fs.rm(files[i].path, '/mnt/adls2/demo/target/' + file)

Итак, ваш новый код может быть следующим:

for i in range (0, len(files)):
    file = files[i].name
        if now in file:  
            dbutils.fs.rm(files[i].path + file, True)
            print ('copied     ' + file)
        else:
            print ('not copied ' + file)
person Fabio Schultz    schedule 08.01.2019
comment
вау @Fabio, я проверю это утром. Если это сработает, я не пойму, как эксперты Databricks (с которыми у меня есть контракт на поддержку) не смогли это понять. Заранее спасибо. Я дам вам знать, как я с этим справляюсь. Ваше здоровье - person Carltonp; 09.01.2019
comment
следующая команда, которую вы предложили, удаляет папку, а также файлы dbutils.fs.rm('/mnt/adls2/demo/target/', True) Мне просто нужно, чтобы файлы были удалены - person Carltonp; 09.01.2019
comment
Фактическая команда в нашем производстве dbutils.fs.rm('adl://devszendsadlsrdpacqncd.azuredatalakestore.net/Folder Structure/RAW/1stParty/LCMS/DE/stageone', True) - person Carltonp; 09.01.2019
comment
Привет @Carltonp, извини, я опаздываю с тобой. Итак, я понял, что вы не можете удалить папку. У меня есть предложение, вы можете использовать dbutils.fs.rm('/mnt/adls2/demo/target/', True), чтобы после этого вы могли снова создать папку dbutils.fs.mkdirs('/mnt/adls2/demo/target/', True) ... Если это не сработает для вас, вы можете перечислить все файлы и удалить один, как вы пробовали раньше - person Fabio Schultz; 09.01.2019
comment
'используйте dbutils.fs.rm (' / mnt / adls2 / demo / target / ', True), чтобы после этого вы могли снова создать папку' именно это я и сделал. Большое спасибо. Кроме того, чтобы вы знали, что оба ваших предложения сработали. Надеюсь, вы не против, но я поделился вашим решением с Databricks. Спасибо чувак - person Carltonp; 09.01.2019
comment
@Carltonp Я рад это знать :) - person Fabio Schultz; 09.01.2019
comment
Проблема с вашим решением (удалить и создать) заключается в том, что он также удаляет настройки разрешений для папок datalake. Таким образом, клиент не может получить доступ к данным, если для папки было установлено какое-то специальное разрешение. - person gszecsenyi; 17.03.2020
comment
@FabioSchultz Приведенная выше команда mkdir должна быть dbutils.fs.mkdirs('/mnt/adls2/demo/target/'), она принимает только один аргумент. - person Aaron Robeson; 16.09.2020

Чтобы удалить файлы из dbfs, вы можете записать это в любой блокнот

%fs rm -r dbfs:/user/sample_data.parquet
person Shikha    schedule 11.02.2021