如何在hadoop hdfs中列出目录中的所有文件及其子目录

2022-09-01 16:24:23

我在hdfs中有一个文件夹,它有两个子文件夹,每个子文件夹有大约30个子文件夹,最后,每个子文件夹都包含xml文件。我想列出所有xml文件,只给出主文件夹的路径。在本地,我可以使用apache commons-io的FileUtils.listFiles()来做到这一点。我试过这个

FileStatus[] status = fs.listStatus( new Path( args[ 0 ] ) );

但它只列出了前两个子文件夹,并没有进一步。有没有办法在hadoop中做到这一点?


答案 1

如果您使用的是hadoop 2.* API,还有更优雅的解决方案:

    Configuration conf = getConf();
    Job job = Job.getInstance(conf);
    FileSystem fs = FileSystem.get(conf);

    //the second boolean parameter here sets the recursion to true
    RemoteIterator<LocatedFileStatus> fileStatusListIterator = fs.listFiles(
            new Path("path/to/lib"), true);
    while(fileStatusListIterator.hasNext()){
        LocatedFileStatus fileStatus = fileStatusListIterator.next();
        //do stuff with the file like ...
        job.addFileToClassPath(fileStatus.getPath());
    }

答案 2

您需要使用 FileSystem 对象并对生成的 FileStatus 对象执行一些逻辑,以手动递归到子目录中。

您还可以应用 PathFilter 以仅使用 listStatus(Path, PathFilter) 方法返回 xml 文件

hadoop FsShell 类有 hadoop fs -lsr 命令的示例,这是一个递归 ls - 请参阅源代码,大约在第 590 行(递归步骤在第 635 行触发)


推荐