it-roy-ru.com

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

23
AlexL

Мы используем 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))
27
nil
   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
Nitin
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, который является вашим подкаталогом

1
Lejla
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 /

0
Shan Hadoop Learner

Хранилище блогов Azure сопоставлено с расположением HDFS, поэтому все операции Hadoop 

На портале Azure , зайдите в учетную запись хранения, вы найдете следующие данные:

  • Аккаунт хранения 

  • Ключ - 

  • Контейнер - 

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

  • Формат даты - гггг-мм-дд

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

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

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

hadoop fs -ls /users/accountsdata 

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

import scala.sys.process._ 

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

Я искал то же самое, однако вместо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
0
Franzi