【问题标题】:How get only need files from HDFS?如何从 HDFS 获取只需要的文件?
【发布时间】:2022-01-09 14:54:09
【问题描述】:

我有方法 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。但我不知道如何使用它。

【问题讨论】:

  • 路径过滤器的工作方式相同

标签: scala hadoop filesystems hdfs


【解决方案1】:

我认为没有太大区别,因为它仍然会迭代所有 NameNode 条目。此外,您不需要 Spark 来执行此操作

在 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,前提是您不关心文件名并且想要实际读取数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2019-07-08
    • 2013-06-13
    • 2021-09-07
    • 1970-01-01
    • 2019-08-22
    相关资源
    最近更新 更多