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

时间:2010-08-09 21:20:29

标签: java file-io path hadoop

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

void func(Path p) {
  if (p.isAbsolute()) {
     File f = new File(p.toURI());
  }
}

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

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

**

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

Path[] paths = DistributedCache.getLocalCacheFiles(job);

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

**

3 个答案:

答案 0 :(得分:12)

我最近遇到了同样的问题,确实有办法从路径中获取文件,但它需要暂时下载文件。显然,这不适用于许多任务,但如果时间和空间对您来说不是必需的,并且您只需要使用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;
    }
}

答案 1 :(得分:2)

如果您获得LocalFileSystem

final LocalFileSystem localFileSystem = FileSystem.getLocal(configuration);

您可以将hadoop Path对象传递给localFileSystem.pathToFile

final File localFile = localFileSystem.pathToFile(<your hadoop Path>);

答案 2 :(得分:1)

不是我知道的。

据我了解,Hadoop中的Path表示其分布式文件系统中节点的标识符。这是与java.io.File不同的抽象,Path表示本地文件系统上的节点。 File 不可能甚至具有行为相同的File表示,因为基础模型根本不同。

因此缺乏翻译。我假设你的断言{{1}}对象“[更多]有用”,你想要一个这个类的对象来使用现有的库方法吗?由于上述原因,这不会很好。如果它是您自己的库,您可以将其重写为使用Hadoop路径干净地工作,然后将任何文件转换为Path对象(此方向适用于Paths是Files的严格超集)。如果它是第三方图书馆,那么你运气不好;该方法的作者没有考虑分布式文件系统的影响,只编写了该方法来处理普通的旧本地文件。