如何从 HDFS 获取只需要的文件?
How get only need files from HDFS?
我有方法 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 文件。
但我想立即应用过滤器。他returns之前的所有文件。请帮我。
我知道在 Hadoop 文件系统库中有一个特殊的 class 用于此 - PathFilter。但是我没有弄清楚如何使用它。
我认为没有太大区别,因为它仍然迭代所有 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,假设您不关心文件名并且想要实际读取数据
我有方法 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 文件。
但我想立即应用过滤器。他returns之前的所有文件。请帮我。 我知道在 Hadoop 文件系统库中有一个特殊的 class 用于此 - PathFilter。但是我没有弄清楚如何使用它。
我认为没有太大区别,因为它仍然迭代所有 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,假设您不关心文件名并且想要实际读取数据