如何从HDFS中仅获取所需文件?

x3naxklr  于 2022-12-09  发布在  HDFS
关注(0)|答案(1)|浏览(199)

我有方法getAllFiles:

import org.apache.hadoop.fs.{LocatedFileStatus, Path}

  def getAllDLFiles: Iterator[LocatedFileStatus] = {

    val hadoopConfig = spark.sparkContext.hadoopConfiguration
    val isCsvFile    = (_ : LocatedFileStatus).getPath.getName.endsWith(".csv")
    val allFiles     = path.getFileSystem(hadoopConfig)
                           .listFiles(path, true)
                           .filter(isCsvFile)
    allFiles
  }

这个方法读取目录中的所有文件,然后应用一个只返回csv文件的过滤器。
但我想马上应用过滤器。在他返回所有文件之前。请帮助我。我知道在Hadoop文件系统库中有一个专门用于此的类- PathFilter。但我不知道如何使用它。

nwo49xxi

nwo49xxi1#

我不认为有什么区别,因为它仍然迭代所有NameNode条目。
在Java中,

FileSystem fileSystem = Filesystem.get(new Configuration());
for (FileStatus fileStatus : fileSystem.globStatus(new Path("/path/to/data/*"), new PathFilter() {

    public boolean accept(Path path) {
        return path.toString().matches("\\.csv$");
    }
    System.out.println(fileStatus);
}

但是使用Spark,您可以执行spark.read.format("csv").path("/path/to/data/")来读取所有CSV,假设您不关心文件名,而是希望实际读取数据

相关问题