使用 Spark 列出 Hadoop HDFS 目录中的所有文件?
Posted
技术标签:
【中文标题】使用 Spark 列出 Hadoop HDFS 目录中的所有文件?【英文标题】:Use Spark to list all files in a Hadoop HDFS directory? 【发布时间】:2014-04-28 22:31:18 【问题描述】:我想遍历 Hadoop 目录中的所有文本文件并计算所有出现的单词“错误”。有没有办法使用 Apache Spark Scala API 使用hadoop fs -ls /users/ubuntu/
列出目录中的所有文件?
从给定的first example 来看,spark 上下文似乎只能通过以下方式单独访问文件:
val file = spark.textFile("hdfs://target_load_file.txt")
在我的问题中,我事先不知道 HDFS 文件夹中有多少文件,也不知道文件的名称。看了spark context docs,没找到这种功能。
【问题讨论】:
【参考方案1】:您可以使用通配符:
val errorCount = sc.textFile("hdfs://some-directory/*")
.flatMap(_.split(" ")).filter(_ == "error").count
【讨论】:
如果我想报告发生错误的文件名怎么办? 使用sc.wholeTextFiles
。关于这个问题,请参阅***.com/questions/29521665/…。【参考方案2】:
import org.apache.hadoop.fs.FileSystem, FileUtil, Path
import scala.collection.mutable.Stack
val fs = FileSystem.get( sc.hadoopConfiguration )
var dirs = Stack[String]()
val files = scala.collection.mutable.ListBuffer.empty[String]
val fs = FileSystem.get(sc.hadoopConfiguration)
dirs.push("/user/username/")
while(!dirs.isEmpty)
val status = fs.listStatus(new Path(dirs.pop()))
status.foreach(x=> if(x.isDirectory) dirs.push(x.getPath.toString) else
files+= x.getPath.toString)
files.foreach(println)
【讨论】:
这是对标题中所述问题的最严格正确答案。接受的答案为 OP 提供了对问题本身要求的更具体的答案,但来自谷歌的任何人都可能会寻找这个。【参考方案3】:对于本地安装,(通过阅读/etc/hadoop/core.xml
可以找到hdfs默认路径fs.defaultFS
):
例如,
import org.apache.hadoop.fs.FileSystem, Path
val conf = sc.hadoopConfiguration
conf.set("fs.defaultFS", "hdfs://localhost:9000")
val hdfs: org.apache.hadoop.fs.FileSystem = org.apache.hadoop.fs.FileSystem.get(conf)
val fileStatus = hdfs.listStatus(new Path("hdfs://localhost:9000/foldername/"))
val fileList = fileStatus.map(x => x.getPath.toString)
fileList.foreach(println)
【讨论】:
以上是关于使用 Spark 列出 Hadoop HDFS 目录中的所有文件?的主要内容,如果未能解决你的问题,请参考以下文章