我正在编写一个小程序,使用Java加载hdfs文件。当我运行代码时,我从hdfs中获取文件列表。并且还能够单独提取分区文件。现在,我想流式传输并读取那些分区的内容。
当我尝试使用FileInputStream加载内容时。提取的分区的绝对路径已加载(例如hdfs:// localhost / hdfs / path / part-00000)。但是,FileInputStream会在内部单独使用单斜杠。因此,绝对路径会转换为hdfs:/ localhost / hdfs / path / part-00000。
反过来引发错误,指出没有这样的路径: ls:`hdfs:/ localhost / hdfs / path / part-00000':没有这样的文件或目录
但是,如果我像下面这样,我可以看到列出分区的路径:
hdfs dfs -ls hdfs:// localhost / hdfs / path / part-00000
下面是示例代码:
Configuration conf = new Configuration();
conf.set("fs.defaultFS",
"hdfs://localhost");
FileSystem hdfs = FileSystem.get(new URI("hdfs://localhost"), conf);
RemoteIterator<LocatedFileStatus> fsStatus = hdfs.listFiles(
new Path("/hdfs/path"), true);
InputStream is = null;
System.out.println("***** Contents of the Directory *****");
while (fsStatus.hasNext()) {
String path = fsStatus.next().getPath().toString();
String str1 = path.substring(path.lastIndexOf("/") + 1);
if (str1.matches("part.*")) {
try (InputStream fis = new FileInputStream(
path);
InputStreamReader isr = new InputStreamReader(
fis, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr)) {
System.out.println(path);
br.lines()
.forEach(line -> System.out.println(line));
}
}
}