使用 dbutils 在 Databricks 中上传后从目录中删除文件
Remove Files from Directory after uploading in Databricks using dbutils
Whosebug 的一位非常聪明的人帮助我将文件复制到 Databricks 的目录中:
如 link:
中所示,我使用相同的原理来删除已复制的文件
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/' 类型错误 - 应为 class bool。
谁能告诉我如何解决这个问题。我认为在最初使用命令 dbutils.fs.rm
复制文件后删除文件会很简单
如果要删除以下路径中的所有文件:'/mnt/adls2/demo/target/'
,有一个简单的命令:
dbutils.fs.rm('/mnt/adls2/demo/target/', True)
无论如何,如果你想使用你的代码,看看dbutils doc:
rm(dir: String, recurse: boolean = false): boolean -> Removes a file or directory
该函数的第二个参数应为布尔值,但您的代码包含路径为的字符串:
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)
为了从 dbfs 中删除文件,您可以在任何笔记本中写下这个
%fs rm -r dbfs:/user/sample_data.parquet
如果您有大量文件,以这种方式删除它们可能会花费很多时间。您可以利用 spark parallelism 并行删除文件。我提供的答案是在 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 class 扩展该对象,如下所示:
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)
}
}
}
现在可以先查看路径是否存在,如果returns为真则可以在多个任务中调用删除功能删除文件夹内的文件。
val directoryPath = "<location"
val directoryExists = CheckPathExists(directoryPath)
if(directoryExists)
{
Helper.delete(directoryPath)
}
Whosebug 的一位非常聪明的人帮助我将文件复制到 Databricks 的目录中:
如 link:
中所示,我使用相同的原理来删除已复制的文件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/' 类型错误 - 应为 class bool。
谁能告诉我如何解决这个问题。我认为在最初使用命令 dbutils.fs.rm
如果要删除以下路径中的所有文件:'/mnt/adls2/demo/target/'
,有一个简单的命令:
dbutils.fs.rm('/mnt/adls2/demo/target/', True)
无论如何,如果你想使用你的代码,看看dbutils doc:
rm(dir: String, recurse: boolean = false): boolean -> Removes a file or directory
该函数的第二个参数应为布尔值,但您的代码包含路径为的字符串:
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)
为了从 dbfs 中删除文件,您可以在任何笔记本中写下这个
%fs rm -r dbfs:/user/sample_data.parquet
如果您有大量文件,以这种方式删除它们可能会花费很多时间。您可以利用 spark parallelism 并行删除文件。我提供的答案是在 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 class 扩展该对象,如下所示:
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)
}
}
}
现在可以先查看路径是否存在,如果returns为真则可以在多个任务中调用删除功能删除文件夹内的文件。
val directoryPath = "<location"
val directoryExists = CheckPathExists(directoryPath)
if(directoryExists)
{
Helper.delete(directoryPath)
}