hadoop从绝对路径和基路径中获取相对路径

oxalkeyp  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(747)

我想从绝对路径得到相对路径,给定绝对基路径。有没有hadoopjavaapi可以做到这一点?
例如,如果我的绝对hdfs路径是 abs_path = hdfs://name-node/level1/level2/level3 我的基本路线是 abs_base_path = hdfs://name-node/level1 ,我想从 abs_path ,也就是 rel_path = level2/level3 . 我熟悉使用路径构造函数来组合两条路径。
例如,如果我有 rel_path 以及 abs_base_path ,我可以使用path类中的一个重载构造函数 http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/Path 建造 abs_path 但是我找不到一个api来做相反的事情。

nue99wik

nue99wik1#

这实际上是在 FileOutputCommitter 的源代码。相关功能是

/**
   * Find the final name of a given output file, given the job output directory
   * and the work directory.
   * @param jobOutputDir the job's output directory
   * @param taskOutput the specific task output file
   * @param taskOutputPath the job's work directory
   * @return the final path for the specific output file
   * @throws IOException
   */
  private Path getFinalPath(Path jobOutputDir, Path taskOutput, 
                            Path taskOutputPath) throws IOException {
    URI taskOutputUri = taskOutput.toUri();
    URI relativePath = taskOutputPath.toUri().relativize(taskOutputUri);
    if (taskOutputUri == relativePath) {
      throw new IOException("Can not get the relative path: base = " + 
          taskOutputPath + " child = " + taskOutput);
    }
    if (relativePath.getPath().length() > 0) {
      return new Path(jobOutputDir, relativePath.getPath());
    } else {
      return jobOutputDir;
    }
  }

其思想是为基目录创建一个uri,然后为这个新的、相对化的uri创建一个新路径。
希望有帮助。

xxb16uws

xxb16uws2#

在使用getparent()递归时生成一个字符串,直到当前路径等于基路径,怎么样?下面是一个helper函数,它可以做您想做的事情(我还没有测试过,但这个想法可能会有所帮助)

private static String absolutePathToRelativeString(final Path path, final Path base) {
    final StringBuilder builder = new StringBuilder(path.toString().length());
    Path curPath = new Path(path);
    while (curPath != null && curPath.depth() != 0 && !curPath.equals(base)) {
       if (!curPath.equals(path)) {
          builder.append('/');
       }
       builder.insert(0, curPath.getName());
       curPath = curPath.getParent();
    }
    return builder.toString();
}

相关问题