作为Spark Scala应用程序的Apt在HDFS目录之间移动文件

时间:2018-06-20 21:59:58

标签: scala apache-spark hdfs

在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文件夹之间移动文件的方法,或者指出上述代码在哪里出错。

1 个答案:

答案 0 :(得分:1)

如果fs.rename(file_source, file_target)表示已成功移动文件,则api boolean返回truefalse表示文件未移动。

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"),其中仅包含目录路径,而不包含文件名。