加载HDFS文件并根据字节大小读取文件

时间:2019-05-04 23:11:39

标签: java hadoop hdfs iostream

我正在编写一个小程序,使用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));
                    }

                }

            }

0 个答案:

没有答案