我想使用Scala / Spark列出hdfs目录中的所有文件夹。
在Hadoop中,我可以使用以下命令执行此操作:hadoop fs -ls hdfs://sandbox.hortonworks.com/demo/
我尝试过:
val conf = new Configuration()
val fs = FileSystem.get(new URI("hdfs://sandbox.hortonworks.com/"), conf)
val path = new Path("hdfs://sandbox.hortonworks.com/demo/")
val files = fs.listFiles(path, false)
但是他似乎没有查看Hadoop目录,因为我找不到我的文件夹/文件。
我也尝试过:
FileSystem.get(sc.hadoopConfiguration).listFiles(new Path("hdfs://sandbox.hortonworks.com/demo/"), true)
但这也无济于事。
你还有其他想法吗?
PS:我也检查了这个帖子:Spark iterate HDFS directory但它对我不起作用,因为它似乎不在hdfs目录上搜索,而只在具有模式文件的本地文件系统上搜索//.
答案 0 :(得分:29)
我们正在使用hadoop 1.4并且它没有listFiles方法,因此我们使用listStatus来获取目录。它没有递归选项,但很容易管理递归查找。
val fs = FileSystem.get(new Configuration())
val status = fs.listStatus(new Path(YOUR_HDFS_PATH))
status.foreach(x=> println(x.getPath))
答案 1 :(得分:3)
val listStatus = org.apache.hadoop.fs.FileSystem.get(new URI(url), sc.hadoopConfiguration)
.globStatus(new org.apache.hadoop.fs.Path(url))
for (urlStatus <- listStatus) {
println("urlStatus get Path:" + urlStatus.getPath())
}
答案 2 :(得分:2)
val spark = SparkSession.builder().appName("Demo").getOrCreate()
val path = new Path("enter your directory path")
val fs:FileSystem = projects.getFileSystem(spark.sparkContext.hadoopConfiguration)
val it = fs.listLocatedStatus(path)
这会在it
上创建一个迭代器org.apache.hadoop.fs.LocatedFileStatus
,这是你的子目录
答案 3 :(得分:1)
我正在寻找相同的,而不是 HDFS , S3 。
我解决了用S3路径创建FileSystem的问题,如下所示:
def getSubFolders(path: String)(implicit sparkContext: SparkContext): Seq[String] = {
val hadoopConf = sparkContext.hadoopConfiguration
val uri = new URI(path)
FileSystem.get(uri, hadoopConf).listStatus(new Path(path)).map {
_.getPath.toString
}
}
我知道这个问题与HDFS有关,但也许像我这样的人会来这里寻找S3解决方案。由于没有在FileSystem中指定URI,它将寻找HDFS。
java.lang.IllegalArgumentException: Wrong FS: s3://<bucket>/dummy_path
expected: hdfs://<ip-machine>.eu-west-1.compute.internal:8020
答案 4 :(得分:1)
在Spark 2.0+中,
import org.apache.hadoop.fs.{FileSystem, Path}
val fs = org.apache.hadoop.fs.FileSystem.get(spark.sparkContext.hadoopConfiguration)
fs.listStatus(new Path(s"${hdfs-path}")).filter(_.isDir).map(_.getPath).foreach(println)
希望这会有所帮助。
答案 5 :(得分:1)
在Ajay Ahujas中,答案isDir
已过时。.
使用isDirectory
...
package examples
import org.apache.log4j.Level
import org.apache.spark.sql.SparkSession
object ListHDFSDirectories extends App{
val logger = org.apache.log4j.Logger.getLogger("org")
logger.setLevel(Level.WARN)
val spark = SparkSession.builder()
.appName(this.getClass.getName)
.config("spark.master", "local[*]").getOrCreate()
val hdfspath = "." // your path here
import org.apache.hadoop.fs.{FileSystem, Path}
val fs = org.apache.hadoop.fs.FileSystem.get(spark.sparkContext.hadoopConfiguration)
fs.listStatus(new Path(s"${hdfspath}")).filter(_.isDirectory).map(_.getPath).foreach(println)
}
结果:
file:/Users/user/codebase/myproject/target
file:/Users/user/codebase/myproject/Rel
file:/Users/user/codebase/myproject/spark-warehouse
file:/Users/user/codebase/myproject/metastore_db
file:/Users/user/codebase/myproject/.idea
file:/Users/user/codebase/myproject/src
答案 6 :(得分:0)
object HDFSProgram extends App {
val uri = new URI("hdfs://HOSTNAME:PORT")
val fs = FileSystem.get(uri,new Configuration())
val filePath = new Path("/user/hive/")
val status = fs.listStatus(filePath)
status.map(sts => sts.getPath).foreach(println)
}
这是获取/ user / hive /
下的hdfs文件或文件夹列表的示例代码答案 7 :(得分:0)
Azure博客存储映射到HDFS位置,因此所有Hadoop操作
在Azure Portal上,转到存储帐户,您会找到以下详细信息:
存储帐户
键 -
容器 -
路径模式 - / users / accountsdata /
日期格式 - yyyy-mm-dd
事件序列化格式 - json
格式 - 行分隔
路径模式这里是HDFS路径,您可以登录/ putty到Hadoop边缘节点并执行:
hadoop fs -ls /users/accountsdata
上面的命令将列出所有文件。在Scala中,您可以使用
import scala.sys.process._
val lsResult = Seq("hadoop","fs","-ls","/users/accountsdata/").!!
答案 8 :(得分:-3)
因为您使用的是Scala,您可能还会对以下内容感兴趣:
import scala.sys.process._
val lsResult = Seq("hadoop","fs","-ls","hdfs://sandbox.hortonworks.com/demo/").!!
遗憾的是,这将以字符串形式返回命令的整个输出,因此只需要一些努力就可以解析为文件名。 (请改用fs.listStatus
。)但是如果您发现自己需要运行其他命令,您可以在命令行中轻松地执行此操作并且不确定如何在Scala中执行此操作,只需使用命令行{{1} }。 (如果您想获得返回代码,请使用单个scala.sys.process._
。)