如何在Hadoop Filesystem中获取绝对路径?

时间:2015-08-22 13:12:46

标签: java scala hadoop apache-spark hdfs

我想获取目录中所有文件的列表及其在HDFS文件系统中的子目录。这是我为了递归读取目录中的所有文件而编写的方法:

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元素的列表,我需要在后续步骤中处理这些元素。因此,我需要完整的道路。我的问题是:获得完整绝对路径的最佳方法是什么

到目前为止,我使用递归方法创建路径字符串(Scala):

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

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

我遇到了问题#18034758,但使用listFiles()而不是listStatus()似乎是递归列出目录中文件的首选方法,因此答案似乎有点麻烦这个用例。

2 个答案:

答案 0 :(得分:2)

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

这样的事情
path.toUri().getRawPath()

答案 1 :(得分:0)

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