我正在开发一个Scala-Spark程序,它需要从HDFS上的目录中获取最新创建的文件(每天在dir中创建一个文件)并读取其中的数据以便进一步处理。 根据我的研究,我发现下面的代码使用Scala获取2天的文件:
import java.nio.file._
import java.time._
import java.time.temporal.ChronoUnit.DAYS
val isMoreThan2DaysOld = Files.getLastModifiedTime(path).toInstant.plus(2, DAYS) isBefore Instant.now
但是此代码不适用于HDFS上存在的文件。任何人都可以让我知道如何使用Scala从HDFS上的目录中选择最新创建的文件。
答案 0 :(得分:4)
您可以在scala中使用普通的hadoop文件系统Apis来获取文件修改日期。并选择最新的一个。
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
val conf = spark.sparkContext.hadoopConfiguration
val fs = FileSystem.get(conf)
val dirPath = new Path("csvdatatest")
val filestatus = fs.listStatus(dirPath )
filestatus.foreach(f => println(f.getModificationTime))
这将按降序列出所有文件的文件修改/创建日期。您可以选择最新的文件作为第一个文件。
注意:如果您使用sparkcontext来获取hadoop配置,那么您不需要在配置中明确指定core-site.xml和hdfs-site.xml。正如我上面所用的那样。
但您可以按照以下伪代码创建配置: 指定core-site.xml和hdfs-site.xml的路径
val conf = new Configuration();
conf.addResource(new Path("<core-site-path>/core-site.xml"));
conf.addResource(new Path("<hdfs-site-path>/hdfs-site.xml"));
val fs = FileSystem.get(conf);