【问题标题】:How to get absolute paths in Hadoop Filesystem?如何在 Hadoop 文件系统中获取绝对路径?
【发布时间】:2015-11-16 08:32:27
【问题描述】:

我想获取 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
}

没有更直接的路径 API 方法吗?

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

【问题讨论】:

    标签: java scala hadoop apache-spark hdfs


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    依赖“toString”可能不是一个好主意。如果 toString 的定义改变了怎么办。我认为最好做类似的事情

    path.toUri().getRawPath()
    

    【讨论】:

      猜你喜欢
      • 2019-08-16
      • 2014-05-24
      • 2011-02-19
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      相关资源
      最近更新 更多