spark scala列出目录中的文件夹

zi8p0yeb  于 2021-05-29  发布在  Hadoop
关注(0)|答案(9)|浏览(826)

我想使用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:我还检查了这个thread:spark iterate hdfs directory,但它对我不起作用,因为它似乎不在hdfs目录上搜索,而是只在schema file//的本地文件系统上搜索。

hl0ma9xz

hl0ma9xz1#

azure博客存储Map到hdfs位置,因此所有hadoop操作
在azure门户上,转到存储帐户,您将发现以下详细信息:
存储帐户
键-
容器-
路径模式–/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/").!!
xmjla07d

xmjla07d2#

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())

}

7uhlpewt

7uhlpewt3#

我们使用的是hadoop1.4,它没有listfiles方法,所以我们使用liststatus来获取目录。它没有递归选项,但很容易管理递归查找。

val fs = FileSystem.get(new Configuration())
val status = fs.listStatus(new Path(YOUR_HDFS_PATH))
status.foreach(x=> println(x.getPath))
5lhxktic

5lhxktic4#

在阿贾伊阿胡哈斯回答 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
izj3ouym

izj3ouym5#

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 那是你的子目录

wyyhbhjk

wyyhbhjk6#

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文件或文件夹列表的示例代码/

u3r8eeie

u3r8eeie7#

在spark 2.0+中,

import org.apache.hadoop.fs.{FileSystem, Path}
val fs = FileSystem.get(spark.sparkContext.hadoopConfiguration)
fs.listStatus(new Path(s"${hdfs-path}")).filter(_.isDir).map(_.getPath).foreach(println)

希望这有帮助。

9w11ddsr

9w11ddsr8#

因为您使用的是scala,所以您可能还对以下内容感兴趣:

import scala.sys.process._
val lsResult = Seq("hadoop","fs","-ls","hdfs://sandbox.hortonworks.com/demo/").!!

不幸的是,这将以字符串的形式返回整个命令输出,因此只解析文件名需要一些努力(使用 fs.listStatus 但是如果您发现自己需要在命令行中轻松地运行其他命令,并且不确定如何在scala中执行,那么只需通过 scala.sys.process._ . (使用单个 ! 如果你只想得到返回码。)

zmeyuzjn

zmeyuzjn9#

不过,对于s3,我要的是相同的,而不是hdfs。
我解决了用s3路径创建文件系统的问题,如下所示:

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解决方案。由于没有在文件系统中指定uri,它将查找hdfs文件。

java.lang.IllegalArgumentException: Wrong FS: s3://<bucket>/dummy_path
expected: hdfs://<ip-machine>.eu-west-1.compute.internal:8020

相关问题