目录中的Spark Scala列表文件夹

时间:2015-10-28 15:17:32

标签: scala hadoop apache-spark

我想使用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目录上搜索,而只在具有模式文件的本地文件系统上搜索//.

9 个答案:

答案 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._。)