У вас есть несколько вариантов: вот два, которые я иногда использую.
Метод # 1: В зависимости от размера ваших данных, использовать следующие команды HDFS (найдено здесь , пункт 6)
hadoop fs -getmerge hdfs-output-dir local-file
// example
hadoop fs -getmerge /user/kenny/mrjob/ /tmp/mrjob_output
// another way
hadoop fs -cat /user/kenny/mrjob/part-r-* > /tmp/mrjob_output
"Это объединяет файлы HDFS hdfs-output-dir / part- * в один локальный файл."
Затем вы можете просто прочитать один файл.(обратите внимание, что он находится в локальном хранилище, а не в HDFS)
Метод # 2 : создайте вспомогательный метод: (У меня есть класс с именем HDFS, который содержит экземпляры Configuration, FileSystem, а такжедругие вспомогательные методы)
public List<Path> matchFiles(String path, final String filter) {
List<Path> matches = new LinkedList<Path>();
try {
FileStatus[] statuses = fileSystem.listStatus(new Path(path), new PathFilter() {
public boolean accept(Path path) {
return path.toString().contains(filter);
}
});
for(FileStatus status : statuses) {
matches.add(status.getPath());
}
} catch(IOException e) {
LOGGER.error(e.getMessage(), e);
}
return matches;
}
Затем вы можете вызвать такую команду: hdfs.matchFiles("/user/kenny/mrjob/", "part-")