Spark Scala список папок в каталоге

Я хочу перечислить все папки в каталоге hdfs с помощью Scala/Spark. В 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: Я также проверил эту тему: Искажать каталог HDFS, но он не работает для меня, поскольку он, похоже, не ищет в каталоге hdfs, а только на локальная файловая система с файлом схемы//.

Ответ 1

Мы используем hasoop 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))

Ответ 2

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

}

Ответ 3

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, который является вашим подкаталогом

Ответ 4

Я искал то же самое, но вместо HDFS, для S3.

Я решил создать FileSystem с моим пути 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 в FileSystem, он будет искать HDFS.

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

Ответ 5

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

Надеюсь, это полезно.

Ответ 6

в 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

Ответ 7

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

Это пример кода для получения списка файлов или папки hdfs, находящихся под/user/hive/

Ответ 8

Azure Blog Storage сопоставляется с местоположением HDFS, поэтому все операции Hadoop

В Azure Portal перейдите в Аккаунт хранилища, вы найдете следующие сведения:

  • Аккаунт хранилища

  • Ключ -

  • Контейнер -

  • Шаблон пути -/users/accountsdata/

  • Формат даты - yyyy-mm-dd

  • Формат сериализации событий - json

  • Формат - выделенная строка

Path Pattern - это путь HDFS, вы можете войти/замаскировать в Hadoop Edge Node и сделать:

hadoop fs -ls /users/accountsdata 

Выше команда отобразит все файлы. В Scala вы можете использовать

import scala.sys.process._ 

val lsResult = Seq("hadoop","fs","-ls","/users/accountsdata/").!!

Ответ 9

Поскольку вы используете Scala, вас также может заинтересовать следующее:

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

Это, к сожалению, вернет весь вывод команды в виде строки, поэтому для разбора только имен файлов требуется некоторое усилие. (Вместо этого используйте fs.listStatus.) Но если вам нужно запустить другие команды, где вы можете легко это сделать в командной строке и не знаете, как это сделать в Scala, просто используйте командную строку через scala.sys.process._. (Используйте один !, если вы хотите просто получить код возврата.)