Как преобразовать объект Hadoop Path в объект Java-файла

java file-io path hadoop

10255 просмотра

3 ответа

108 Репутация автора

Есть ли способ изменить действительный и существующий объект Hadoop Path в полезный объект Java File. Есть хороший способ сделать это, или мне нужно, чтобы дубинкой кодировать в представлении? Более очевидные подходы не работают, и кажется, что это будет обычная часть кода

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

Это не работает, потому что Path :: toURI () возвращает идентификатор "hdfs", а конструктор Java File (URI uri) распознает только идентификатор "file".

Есть ли способ заставить Path и File работать вместе?

**

Хорошо, как насчет конкретного ограниченного примера.

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

Предполагается, что DistributedCache предоставляет локализованную копию файла, но возвращает путь. Я предполагаю, что DistributedCache создает локальную копию файла, где они находятся на одном диске. Учитывая этот ограниченный пример, где, как мы надеемся, hdfs не входит в уравнение, есть ли способ для меня надежно преобразовать путь в файл?

**

Автор: akintayo Источник Размещён: 09.08.2010 09:20

Ответы (3)


1 плюс

88099 Репутация автора

Решение

Не то, чтобы я знал.

Насколько я понимаю, a Pathв Hadoop представляет идентификатор узла в их распределенной файловой системе. Это отличная от абстракции java.io.File, которая представляет узел в локальной файловой системе. Маловероятно, что a Path может даже иметь Fileпредставление, которое будет вести себя эквивалентно, потому что базовые модели принципиально отличаются.

Отсюда и отсутствие перевода. Я предполагаю, что вы утверждаете, что Fileобъекты «[более] полезны», вам нужен объект этого класса, чтобы использовать существующие методы библиотеки? По указанным выше причинам это не будет работать очень хорошо. Если это ваша собственная библиотека, вы можете переписать ее для чистой работы с путями Hadoop, а затем преобразовать любые файлы в объекты пути (это направление работает, поскольку пути являются строгим надмножеством файлов). Если это сторонняя библиотека, то вам не повезло; авторы этого метода не приняли во внимание влияние распределенной файловой системы и только написали этот метод для работы с простыми старыми локальными файлами.

Автор: Andrzej Doyle Размещён: 09.08.2010 09:35

13 плюса

18149 Репутация автора

У меня недавно был тот же вопрос, и действительно есть способ получить файл по пути, но он требует временной загрузки файла. Очевидно, что это не подойдет для многих задач, но если вам не нужно время и пространство и вам просто нужно что-то для работы с файлами из 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;
    }
}
Автор: Eli Размещён: 07.02.2012 08:37

2 плюса

319 Репутация автора

Если вы получаете LocalFileSystem

final LocalFileSystem localFileSystem = FileSystem.getLocal(configuration);

Вы можете передать свой объект Path hadoop в localFileSystem.pathToFile

final File localFile = localFileSystem.pathToFile(<your hadoop Path>);
Автор: James Gawron Размещён: 27.07.2015 10:11
Вопросы из категории :
32x32