Scala中如何用foreach为列表批量应用获取最新CSV文件的函数
用Scala的foreach循环处理路径列表获取最新文件
首先明确foreach的核心作用:它是遍历集合中的每个元素,对每个元素执行带副作用的代码(比如打印、写入外部存储等),不会返回新集合,仅执行操作。
1. 直接用foreach遍历路径并输出结果
如果你只是想打印每个路径对应的最新文件路径(和你期望的结果一致),直接在paths列表上调用foreach即可:
// 先初始化SparkSession(根据你的环境调整配置) val spark: SparkSession = SparkSession.builder() .appName("GetLatestFiles") .master("local[*]") .getOrCreate() val paths: List[String] = List( "src/main/resources/historical_novel/", "src/main/resources/detective/", "src/main/resources/adventure/", "src/main/resources/horror/") // 遍历每个路径,调用getLastFile并打印结果 paths.foreach { path => val lastFile = getLastFile(path, spark) println(lastFile) }
这段代码会逐个处理列表中的路径,调用你的getLastFile函数获取最新文件路径,然后打印出你期望的结果。
2. 搞清楚foreach和map的区别
你之前用DataFrame的withColumn实现,本质是转换操作(返回新的DataFrame);而foreach是执行操作(无返回值)。如果需要把所有结果收集到集合里,应该先用map转换,再用foreach处理:
// 先用map转换得到所有最新文件的路径列表 val lastFiles: List[String] = paths.map(path => getLastFile(path, spark)) // 再用foreach遍历列表做后续操作(比如打印、写入文件) lastFiles.foreach(println)
map会返回一个包含所有结果的新List;foreach仅遍历这个List执行副作用操作。
3. 补全getLastFile函数示例
为了让流程完整,这里给出基于HDFS文件系统的getLastFile实现:
import org.apache.spark.sql.SparkSession import org.apache.hadoop.fs.{FileSystem, Path} def getLastFile(path: String, spark: SparkSession): String = { val fs = FileSystem.get(spark.sparkContext.hadoopConfiguration) val hdfsPath = new Path(path) // 列出路径下所有文件,过滤掉目录 val files = fs.listStatus(hdfsPath) .filter(!_.isDirectory) .map(status => status.getPath) // 按文件修改时间排序,取最新的文件 val lastFile = files.sortBy(_.getModificationTime).last lastFile.toString }
内容的提问来源于stack exchange,提问作者just_starting
相关产品推荐
相关产品推荐

