在spark应用程序中的两个HDFS文件夹之间移动文件时,我遇到了问题。我们使用Spark 2.1版本和Scala作为编程语言。我导入了org.apache.hadoop.fs软件包和“重命名”方法来解决文件移动问题,因为在该软件包中找不到在“ HDFS文件夹之间移动文件”的方法。 代码如下。
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, Path}
def move_files(fileName, fromLocation:String, toLocation:String, spark: SparkSession): Unit = {
val conf = spark.sparkContext.hadoopConfiguration
val fs = FileSystem.get(conf)
val file_source = new Path(fromLocation + "/" + fileName)
println(file_source)
val file_target = new Path(toLocation + fileName)
println(file_target)
try {
fs.rename(file_source, file_target)
} catch {
case e: Exception => println(e); println("Exception moving files between folders")
}
}
在另一个具有其他应用程序逻辑的方法中调用了移动文件方法,在继续执行该逻辑之前,我需要从源目录中删除所需的文件。
def main () {
/*
logic
*/
move files (abc.xml, /location/dev/file_folder_source, /location/dev/file_folder_target, spark)
/*
logic
*/
}
该move_files步骤正在执行,没有任何错误,但是文件没有从源文件夹移到目标文件夹。由于源文件夹中存在错误文件,导致程序执行错误的逻辑继续进行。请提出任何其他在hdfs文件夹之间移动文件的方法,或者指出上述代码在哪里出错。
答案 0 :(得分:1)
如果fs.rename(file_source, file_target)
表示已成功移动文件,则api boolean
返回true
。 false
表示文件未移动。
move_files
成功执行,因为使用的api在无法移动文件的情况下不会失败。它仅返回false
并继续执行。
您需要在代码中明确检查条件。
要使用fs.rename
api,您需要创建目标目录,然后仅提供目标目录路径。如下所示:
val file_target = new Path("toLocation")
fs.mkdirs(file_target)
fs.rename(file_source, file_target)
请参见此行val file_target = new Path("toLocation")
,其中仅包含目录路径,而不包含文件名。