2015-08-22 230 views
1

我想获取HDFS文件系统中目录及其子目录中所有文件的列表。这是我为递归读取目录中的所有文件的目的编写的方法:如何在Hadoop文件系统中获得绝对路径?

def getAllFiles(dir: Path, fs: FileSystem, recursive: Boolean = true): Seq[Path] = { 
    val iter = fs.listFiles(dir, recursive) 
    val files = new ListBuffer[Path]() 

    while (iter.hasNext()) { 
    val p = iter.next().getPath 
     files.append(p) 
    } 
    files 
} 

结果是org.apache.hadoop.fs.Path元素,我需要在子序贯步骤来处理的列表。因此,我需要全路径。我的问题是:什么是获得完整的绝对路径

到目前为止,我使用递归方法来创建路径字符串(斯卡拉)的最佳方式:

def fullPath(p: Path): String = { 
    if (p.isRoot()) 
    p.getName 
    else 
    fullPath(p.getParent) + Path.SEPARATOR + p.getName 
} 

有没有更直接的通过Path API的方式?

我遇到的问题#18034758,但使用listFiles()而不是listStatus()似乎是递归列出目录中的文件,以便答案似乎对于这种使用情况有点麻烦的首选方式。

回答

0

toString()方法org.apache.hadoop.fs.Path返回完整路径。

+0

谢谢!太糟糕了,这里没有记录:https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/fs/Path.html#toString-- – Carsten

1

依靠“toString”可能不是一个好主意。如果toString的定义发生变化怎么办?我认为最好是做点像

path.toUri().getRawPath() 
相关问题