如何将Hadoop Path对象转换为Java File对象

aki*_*ayo 9 java file-io hadoop path

有没有办法将有效的和现有的Hadoop Path对象更改为有用的Java File对象.有没有一种很好的方法可以做到这一点,还是我需要敲诈来编码提交?更明显的方法不起作用,似乎它是一个常见的代码

void func(Path p) {
  if (p.isAbsolute()) {
     File f = new File(p.toURI());
  }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为Path :: toURI()返回"hdfs"标识符,Java的File(URI uri)构造函数只识别"文件"标识符.

有没有办法让Path和File一起工作?

**

好的,一个特定的有限例子怎么样.

Path[] paths = DistributedCache.getLocalCacheFiles(job);
Run Code Online (Sandbox Code Playgroud)

DistributedCache应该提供文件的本地化副本,但它返回一个Path.我假设DistributedCache制作文件的本地副本,它们位于同一磁盘上.鉴于这个有限的例子,hdfs希望不在等式中,有没有办法让我可靠地将Path转换为文件?

**

Eli*_*Eli 13

我最近有同样的问题,并且确实有一种从路径获取文件的方法,但它需要临时下载文件.显然,这不适用于许多任务,但如果时间和空间对您来说不是必需的,并且您只需要使用Hadoop中的文件工作,请执行以下操作:

import java.io.File;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public final class PathToFileConverter {
    public static File makeFileFromPath(Path some_path, Configuration conf) throws IOException {
        FileSystem fs = FileSystem.get(some_path.toUri(), conf);
        File temp_data_file = File.createTempFile(some_path.getName(), "");
        temp_data_file.deleteOnExit();
        fs.copyToLocalFile(some_path, new Path(temp_data_file.getAbsolutePath()));
        return temp_data_file;
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*yle 0

据我所知。

据我了解,PathHadoop 中的 a 代表分布式文件系统中节点的标识符。这是与 a 不同的抽象java.io.File, a 表示本地文件系统上的节点。Path a甚至不可能有一个File表现相同的表示,因为底层模型根本不同。

因此缺乏翻译。根据您的断言,我认为File对象“[更]有用”,您想要此类的对象才能使用现有的库方法吗?由于上述原因,这不会很好地发挥作用。如果它是您自己的库,您可以重写它以与 Hadoop 路径完美配合,然后将任何文件转换为路径对象(此方向有效,因为路径是文件的严格超集)。如果它是第三方库那么你就不走运了;该方法的作者没有考虑分布式文件系统的影响,并且只编写该方法来处理普通的旧本地文件。

  • 这个答案是错误的:Hadoop [Path](https://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/Path.html) 不是 Hadoop 文件系统中节点的标识符,而是任何文件系统中的文件或目录。Hadoop [文件系统](https://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileSystem.html) 是通用的,这意味着可以支持不同的文件系统,而不仅仅是 HDFS。文档中写得很清楚。之所以没有从 Hadoop `Path` 到 Java `File` 的转换,并不是因为它们代表了两种不同的抽象。 (9认同)